• 等号运算符的重载这里有疑问,已解决


    #define  _CRT_SECURE_NO_WARNINGS 
    #include<iostream>
    
    using namespace std;
    
    //等号运算符的重载
    class Array
    {
    public:
    	//int strlen(char *)
    	Array(char *t1)
    	{
    		this->length=strlen(t1);
    		this->p = new char [length +1];
    		strcpy(p,t1);
    	}
    	Array(const Array &t2)
    	{
    		this->length=t2.length;
    		this->p = new char [length +1];
    		strcpy(p,t2.p);
    	}
    	
    	Array& operator=(Array &obj1)
    	{
    		//先释放旧的内存
    		if (this->p != NULL)
    		{
    			delete[] p;
    			length = 0;
    		}
    		//2 根据obj1分配内存大小
    		this->length = obj1.length;
    		this->p = new char [length+1];
    		
    		//把obj1赋值
    		strcpy(p, obj1.p);
    		return *this;
    	}
    
    	~Array()
    	{
    		if(*p !=NULL)
    		{
    			delete [] p;
    			length=0;
    		}
    	}
    	void printf()
    	{
    		cout<<this->p;
    	}
    
    private:
    	int length;
    	char *p;
    protected:
    };
    
    int main()
    {
    	Array a1("dasfsf");
    	Array a2=a1;//调用赋值构造函数,必须重新定义,要不然是浅拷贝,出错
    	a2.printf();
    	cout<<endl;
    	Array a4("dasda");
    	
    	a4=a1;//浅拷贝,需重新定义等号。
    	a4.printf();
    	cout<<endl;
    
    	system("pause");
    	return 0;
    }
    

      上图这样子是对的,但是为什么给形参默认值的时候,就会出错?

    #define  _CRT_SECURE_NO_WARNINGS 
    #include<iostream>
    
    using namespace std;
    
    //等号运算符的重载
    class Array
    {
    public:
    	//int strlen(char *)
    	Array(char *t1=0)
    	{
    		this->length=strlen(t1);
    		this->p = new char [length +1];
    		strcpy(p,t1);
    	}
    	Array(const Array &t2)
    	{
    		this->length=t2.length;
    		this->p = new char [length +1];
    		strcpy(p,t2.p);
    	}
    	
    	Array& operator=(Array &obj1)
    	{
    		//先释放旧的内存
    		if (this->p != NULL)
    		{
    			delete[] p;
    			length = 0;
    		}
    		//2 根据obj1分配内存大小
    		this->length = obj1.length;
    		this->p = new char [length+1];
    		
    		//把obj1赋值
    		strcpy(p, obj1.p);
    		return *this;
    	}
    
    	~Array()
    	{
    		if(*p !=NULL)
    		{
    			delete [] p;
    			length=0;
    		}
    	}
    	void printf()
    	{
    		cout<<this->p;
    	}
    
    private:
    	int length;
    	char *p;
    protected:
    };
    
    int main()
    {
    	Array a1("dasfsf");
    	Array a2=a1;//调用赋值构造函数,必须重新定义,要不然是浅拷贝,出错
    	a2.printf();
    	cout<<endl;
    	Array a4("dasda");
    	Array a3;
    	a3=a4;//浅拷贝,需重新定义等号。
    	a3.printf();
    	cout<<endl;
    
    	system("pause");
    	return 0;
    }
    

      运行没有错误,但是编译不出来

    我的天啊,在大大神的帮忙下,终于解决了,原因是Strlen不能应用于NULL指针。

    遇见问题要一步一步分析精确到一行,我的天啊,感觉自己还有差距

  • 相关阅读:
    [Jenkins] 批量删除构建历史
    [Android Tips] 32. 解决 Android Device Monitor 在 Mac OS X 卡住
    [Gradle] 查看项目依赖
    [Gradle] 获取 gradle 命令行参数
    [Android Tips] 31.如何将第三库引入的 Permission 删除掉
    [Gradle] 发布构件到本地仓库
    [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码
    下载安卓应用的历史版本
    设置int、float型数据的输出格式
    头文件limits—各个类型的数据的范围
  • 原文地址:https://www.cnblogs.com/xiaochige/p/6596180.html
Copyright © 2020-2023  润新知