zoukankan      html  css  js  c++  java
  • 等号运算符的重载这里有疑问,已解决

    #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指针。

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

  • 相关阅读:
    Educational Codeforces Round 92
    练习
    03 并查集(带权,分类) 树状数组 线段树
    02 动态规划 LIS LCS
    05 矩阵优化 (斜率优化等待补)
    01 STL 打表 二分查找
    AtCoder Beginner Contest 174
    Codeforces Round #660 (Div. 2)
    PCHMI工控组态开发视频教程
    分享一款免费的工控组态软件(PCHMI)
  • 原文地址:https://www.cnblogs.com/xiaochige/p/6596180.html
Copyright © 2011-2022 走看看