读书人

是不是可以用传入对象地址的自定义构造

发布时间: 2012-07-08 17:43:43 作者: rapoo

是否可以用传入对象地址的自定义构造函数替代拷贝构造函数
直接用一个例子吧:
//定义一个类TEST有一个数据成员a。构造函数有两个,一个没有参数,一个传入一个TEST对象的地址。
class TEST
{
int a;
public:
void seta(int x){a = x;}
TEST(TEST *pT){a = pT->a;}
TEST(){a = 0;}
};

//定义一个TEST类对象aa,并修改其中数据成员a的值,然后用aa的地址作为参数来构造bb。
void main()
{
TEST aa;
aa.seta(10);
TEST bb(&aa);
}

是可以的,bb的构造函数TEST(TEST *pT)被调用到,并且进行了初始化。

那么,这样的构造函数,可以代替TEST(TEST &rt)这样的拷贝构造函数吧?
那拷贝构造函数的优势是什么呢?就是有默认的,不用自定义?

[解决办法]
拷贝可以重写的
[解决办法]
pT == NULL ???
[解决办法]
拷贝构造函数的参数必须是引用(一般还是const的),除此之外的对象或者对象指针都是错误的。

因为
1. 只有引用作为参数的时候,才不会产生副本。其它情况,比如实参是一个该类的一个对象,或者该类的对象指针都会产生副本。

2. 要产生副本,就会调用该类的拷贝构造函数,这样从理论上就会产生死循环。

[解决办法]
楼主找本C++之父亲写的《C++语言设计与演化》先看看吧。
[解决办法]
楼上的依据是啥?我写了程序试了下传指针没有副本产生啊
class test
{
int a;
public:
test()
{
a = 0;
cout<<"test()"<<endl;
}

test(int t)
{
a = t;
cout<<"test(int t)"<<endl;
}

test(test *t)
{
a = t->a;
cout<<"test(test *t)"<<endl;
}

test(const test &t)
{
a = t.a;
cout<<"test(const test &t)"<<endl;
}
};

void f(test *t)
{
cout<<"f(test *t)"<<endl;
}
int main()
{
test t(1);

test t2(t);

test t3(&t);

f(&t);
}
输出是
test(int t)
test(const test &t)
test(test *t)
f(test *t)
没有体现第三个f调用的时候产生了副本
[解决办法]

探讨
拷贝构造函数的参数必须是引用(一般还是const的),除此之外的对象或者对象指针都是错误的。

因为
1. 只有引用作为参数的时候,才不会产生副本。其它情况,比如实参是一个该类的一个对象,或者该类的对象指针都会产生副本。

2. 要产生副本,就会调用该类的拷贝构造函数,这样从理论上就会产生死循环。

读书人网 >C++

热点推荐