拷贝构造函数
复制构造函数(英语:Copy constructor)是C++编程语言中的一种特别的构造函数,习惯上用来创建一个全新的对象,这个全新的对象相当于已存在对象的副本。这个构造函数只有一个参数(引数):就是用来复制对象的引用(常用const修饰)。构造函数也可以有更多的参数,但除了最左第一个参数是该类的引用类型外,其它参数必须有默认值。
类的复制构造函数原型通常如下:
Class_name(const Class_name & src);
一般来说,假如程序员没有自行编写复制构造函数,那么编译器会自动地替每一个类创建一个复制构造函数;相反地,程序员有自行编写复制构造函数,那么编译器就不会创建它。
当对象包括指针或是不可分享的引用时,程序员编写显式的复制构造函数是有其必要性的,例如处理文件的部分,除了复制构造函数之外,应该还要再编写析构函数与赋值运算符的部分,也就是三法则。
例子:
my-copydata.h
#ifndef __MYCOPYDEMO__
#define __MYCOPYDEMO__
class CopyDemo
{
public:
CopyDemo(const char* data = 0);
CopyDemo(const CopyDemo& data); // 拷贝构造
CopyDemo& operator=(const CopyDemo& data);
~CopyDemo();
char* get_data() const { return data_; }
private:
char* data_;
};
#endif // !__MYCOPYDEMO__
my-copydata.cc
#include "my-copydata.h"
#include <string.h>
CopyDemo::CopyDemo(const char* data)
{
if (data)
{
data_ = new char[strlen(data) + 1];
strcpy(data_, data);
}
else
{
data_ = new char[1];
*data_ = '\0';
}
}
CopyDemo::CopyDemo(const CopyDemo& data) // 拷贝构造
{
data_ = new char[strlen(data.data_) + 1]; // 深拷贝
strcpy(data_, data.data_);
}
// 拷贝赋值 operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。
CopyDemo& CopyDemo::operator=(const CopyDemo& data) // 拷贝赋值
{
if (this == &data)
{ // 检测自我赋值
return *this;
}
delete[] data_; // 释放本身空间
data_ = new char[strlen(data.data_) + 1]; // 创建新的空间
strcpy(data_, data.data_); // 拷贝内容
return *this;
}
CopyDemo::~CopyDemo()
{
delete[] data_;
}
main.cc
#include "my-copydata.h"
int main()
{
CopyDemo s1;
CopyDemo s2("hello");
CopyDemo s3(s1);
printf("s3 = %p, data=%s\n", &s3, s3.get_data());
s3 = s2;
printf("s3 = %p, data=%s\n", &s3, s3.get_data());
getchar();
return 0;
}
// 结果:
// s3 = 008FFB4C, data=
// s3 = 008FFB4C, data=hello