拷贝
用一个存在的object创建一个新的object
下面程序中两次调用拷贝构造
#include <iostream>
#include <string>
using namespace std;
static int objectCount = 0;
class HowMany{
public:
HowMany(){
objectCount++;
print("HowMany()");
}
HowMany(const HowMany &hw){
objectCount++;
print("HowMany(const HowMany&)");
}
void print(const string& msg=""){
if(msg.size() != 0) cout << msg << ": ";
cout << "objectCount = "
<< objectCount << endl;
}
~HowMany(){
objectCount--;
print("~HowMany()");
}
};
HowMany f(HowMany x){
cout << "begin of f" << endl;
x.print("x argument inside f()");
cout << "end of f" << endl;
return x;
}
int main(){
HowMany h;
h.print("after construction of h");
HowMany h2 = f(h);
h.print("after call to f()");
}
拷贝构造
拷贝构造格式: T::T(const T&); 若程序没有定义拷贝构造函数,编译器将会默认生成一个。类成员含有对象,将调用该对象的拷贝构造,否则,将是按照memberwise拷贝
当class中有pointer成员
默认拷贝时拷贝了指针,没有拷贝指针所指向的对象,析构的时候可能导致对同块内存的多次释放。需要自定义拷贝构造函数来创建内存。
什么时候拷贝构造会被调用?
a. 函数参数是对象本身,不是指针或引用
class Person{
...
};
void roster(Person player);
b. 用一个对象初始化另一个对象
Person baby_a("Fred");
Person baby_b = baby_a;
Person baby_c(baby_a);
c. 返回一个对象
Person f(){
Person p;
return p;
}
拷贝构造函数参考
a. 在通常情况下,自定义拷贝构造函数,不要依赖于系统默认的
b. 如果不想使用拷贝构造,将其声明为私有,防止默认拷贝构造被调用