关于拷贝构造函数

转载 2015年11月21日 13:48:24

用到拷贝构造函数的地方有3种情况:

1)一个对象用于给另外一个对象进行初始化赋值初始化

2)一个对象作为函数参数,以值传递的方式传入函数体

3)一个对象作为函数返回值,以值传递的方式从函数返回

为什么要用到拷贝构造函数

原则:对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数
对于第一种情况,先用一个例子进行以下的说明:
//这个类的主要特点是包含指向其他资源的指针,pBuffer指向堆中动态分配的一段内存空间。
class CExample
{
private:
	char* pBuffer;//类的对象中包含指针,指向动态分配的内存资源
	int nSize;
public:
	CExample()//构造函数
	{
		pBuffer = NULL;
		nSize = 0;
	}
	~CExample()//析构函数
	{
		delete[] pBuffer;
	}
	void Init(int n)
	{
		pBuffer = new char[n];
		nSize = n;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	CExample theObjone;
	theObjone.Init(40);
	//现在需要另一个对象,并将它初始化为theObjone
	CExample theObjtwo = theObjone;
	getchar();
	return 0;
}
<span style="white-space:pre">	</span>语句"CExample theObjtwo = thObjone;"用theObjone初始化theObjtwo
<span style="white-space:pre">	</span>此语句的具体过程:首先,建立对象theObjtwo,然后,调用其构造函数,然后,成员被复制初始化。
<span style="white-space:pre">	</span>其完成方式是内存拷贝,复制所有成员的值。完成后,theObjtwo.pBuffer == theObjone.pBuffer
<span style="white-space:pre">	</span>即,它们指向同样的地方,指针虽然复制了,但所指向的空间并没有复制,儿时由两个对象共用了。这样不符合要求,对象之间部队里了,并为空间的删除带来隐患。
这就是引入<span style="background-color: rgb(204, 51, 204);">拷贝构造函数</span>的初衷。

对于第二,第三种情况,如果不使用拷贝构造函数,就会导致一个指针指向已经被删除的内存空间。
第二种情况,对象按值传递:当对象直接作为参数传给函数时,函数将简历对象的临时拷贝,这个拷贝过程也将调用拷贝构造函数。
bool testfunc(CExample obj);
testfunc(theObjone);
bool testfunc(CExample obj)
{}
<span style="white-space:pre">	</span>第三种情况:当函数中的局部对象作为返回值被返回给函数调用者时,也将建立此局部对象的一个<strong>临时拷贝</strong>,拷贝构造函数也将被调用。
CTest func()
{
CTest theTest;
return theTest;
}

拷贝构造函数的样子

格式:类名(const类名&对象名)------CExample(const CExample&);
参数是常量对象的引用。由于拷贝构造函数的目的是成员复制,不应修改原对象,所以建议使用const关键字



C++中拷贝构造函数的使用

  • 2012年07月29日 08:56
  • 275KB
  • 下载

拷贝构造函数

  • 2014年03月10日 22:22
  • 35KB
  • 下载

为需要动态分配内存的类声明一个拷贝构造函数与一个赋值运算运算符

构造函数,析构函数和赋值操作符 几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。这没什么奇怪的,因为它们提供的都是一些最基本的功能。构造函数控制对象生成时的基本操作,并保证对象被初...

C++拷贝构造函数和赋值操作

  • 2012年01月10日 13:51
  • 3KB
  • 下载

一步一步学习C++(类)之拷贝构造函数

拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”)。 1) ...

拷贝构造函数..........

  • 2008年09月11日 23:26
  • 3KB
  • 下载

析构函数和拷贝构造函数

  • 2012年08月30日 13:16
  • 131KB
  • 下载

String 类的拷贝构造函数, 赋值操作符重载, 算数操作符重载

一般来讲 赋值,下标,调用 和成员放文件头必须定义为成员函数,否则在编译时会出现错误复合复制操作符通常也应该定义为类的成员(当然不这么做不会出现编译错误)改变对象状态的自增 自减 解引用 应该定义为...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于拷贝构造函数
举报原因:
原因补充:

(最多只允许输入30个字)