转载

C++复制构造函数,重载赋值运算符

C++的复制构造函数, 赋值构造函数, 有时候会有点晕,下面总结一下:


首先来谈一下复制构造函数:

代码:

#include<iostream>
using namespace std;
#include<cstring>
#include<cstdlib>

class A
{
	private:
		char *str;
		int num;
	
	public:
		A(char *str, int num)
		{
			this->str = new char[18];
			strcpy(this->str, str);
			this->num = num;
		}
		
		void fuction()
		{
			delete[]str;
		}
		
		void show()
		{
			cout << str << " " << num << endl;
		}
}; 

int main()
{
	A a("zhouyu", 20);
	a.show();
	
	A b = a;  //调用了默认的复制构造函数 
	b.show();
	b.fuction(); //释放了b的str内存 
	
	a.show(); //结果字符乱码 
	return 0;
}
代码解释:

定义了一个类,数据成员有字符指针,和整型数, 函数有构造函数,show函数,和释放字符内存函数

运行一下程序,你会发现第二次调用a.show(),结果会是乱码,关键在于A b = a;这句调用了默认复制

函数,这个函数做了什么,通过乱码的结果我们可想而知,free了b.str,而a.str也free掉了,所以两个

字符指针指向同一内存,所以默认的复制构造函数功能:逐个复制非静态成员数据;很硬性的

可以加一个自己定义的复制构造函数,这样就不是地址复制,值复制

代码:

A(const A &a)
{
 this->str = new char[18];
	strcpy(this->str, a.str);  this->num = a.num;	
} 

复制构造函数调用情况:

1:一个对象以值传递的方式传人函数体

2:一个对象以值传递的方式从函数返回

3:一个对象要通过另一个对象进行初始化


赋值运算符:

将已有的对象赋给另一个对象时,将使用重载的赋值运算符

代码:

#include<iostream>
using namespace std;
#include<cstring>
#include<cstdlib>

class A
{
	private:
		char *str;
		int num;
	
	public:
		A(char *str, int num)
		{
			this->str = new char[18];
			strcpy(this->str, str);
			this->num = num;
		}
		
		void fuction()
		{
			delete[]str;
		}
		
		void show()
		{
			cout << str << " " << num << endl;
		}
}; 

int main()
{
	A a("zhouyu", 20);
	a.show();
	
	A b("zhoukun", 20);
	b.show();
	
	b = a; //调用了默认的运算符重载函数
	b.fuction(); //释放了b的str内存 
	
	a.show(); //结果字符乱码 
	return 0;
}

解释:会发现结果同样是乱码, 不幸的是, 默认的运算符重载函数,跟默认的复制构造函数一样,也是硬性的

复制非静态成员数据,同样我们需要重写默认的运算符重载函数

代码:

A & operator=(const A& a)
{
	this->str = new char[18];
	strcpy(this->str, a.str);
	this->num = a.num; return *this;
}




正文到此结束
本文目录