拷贝构造函数
int i = 0;
int i(0);
数据类型可以扩展。
先看一个例子:
class howmany{
static int object_count;
public:
howmany(){
object_count++;
}
static void print(){
cout<<"object_count=" <<object_count<<endl;
}
~howmany(){
object_count--;
print();
}
};
int howmany::object_count=0;
howmany f(howmany x){
x.print();
return x;
}
int main()
{
howmany h;
howmany::print();
howmany h2=f(h);
howmany::print();
return 0;
}
修改这个的方法,定义自己的copy构造函数。
class howmany{
static int object_count;
public:
howmany(){
object_count++;
}
static void print(){
cout<<"object_count=" <<object_count<<endl;
}
howmany(const howmany& h);
~howmany(){
object_count--;
print();
}
};
howmany::howmany(const howmany& h){
object_count++;
}
int howmany::object_count=0;
howmany f(howmany x){
x.print();
return x;
}
int main()
{
howmany h;
howmany::print();
howmany h2=f(h);
howmany::print();
return 0;
}
C++默认的提供了一个copy 构造函数。原型为X:X(X & x) ,注意此处为引用。
如果使用 X:X(X x), 那么在给x参数赋值的时候会使用到copy构造,就会导致死循环中。
· 拷贝构造函数的定义 X(X&)
缺省情况下用bit-copy完成从一个对象生成另一个对象的工作。但是这样做存在问题。
一方面,对象的构造和析构函数如果不能正确的调用,可能无法维护对象的完整性。
另一方面,如果对象内部存在对其他对象的引用,bit-copy也可能并不合适。
对例子的修改
· 缺省拷贝构造函数
一个类如果未定义任何构造函数,编译器会生成一个缺省构造函数。但是如果定义了自己的构造函数,甚至是拷贝构造函数,那么编译器 就不会再生成这样的缺省构造函数了 。
反之,如果定义了构造函数,而没有定义拷贝构造函数,编译器仍然 会生成缺省的拷贝构造函数 。这个函数仅仅负责完成bit-copy的功能。