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

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

  • 相关阅读:
    随笔:判断一个范围内有多少质数,分别是多少
    随笔:判断一个整数是否是质数,如果不是质数,那么因数表达式是什么
    随笔:Python发送SMTP邮件方法封装
    Python基础学习:打印九九乘法表
    随笔:docker学习笔记(包括了基础学习和制作运行jar包的docker镜像,还有centos7防火墙这个坑)
    随笔:测试心得
    随笔:docker安装
    Python基础:Python连接MySQL数据库方法封装2
    随笔:Python打印临时日志、清空临时日志
    radio点击一下选中,再点击恢复未选状态
  • 原文地址:https://www.cnblogs.com/xiaochige/p/6596180.html
Copyright © 2011-2022 走看看