为什么要有拷贝构造函数?
看下面代码:
#include <iostream.h>
class TEST
{
TEST(int i)
{
cout<<"Constructing with"<<i<<"./n";
value = i;
return;
}
~TEST()
{
cout<<"Destructing./n";
}
int get()
{
return value;
}
private:
int value;
}
void display(TEST obj)
{
cout<<"Display With"<<obj.get()<<"./n";
return;
}
int main()
{
TEST explorer(5);
display(explorer);
return 0;
}
该程序的输出结果是:
Constructing with 5.
Display with 5.
Destructing.
Destructing.
从这个结果中我们可以看到, 构造函数被执行了一次,但是析构函数却被执行了两次, 这样是有问题的,如果我们在构造函数中进行了new,在析构函数中进行了delete的话,那么这样的话就会出现内在泄漏了. 为什么会出现这种现象呢? 因为当display被调用的时候进行的是值传递, 首先会创建一个obj的副本, 然后将该函数传递给display,函数调用结束后该副本被撤销. 但是创建副本时没有调用构造函数(没有合适的构造函数可供调用.), 销毁时却调用了析构函数. 解决这个问题有两个方法,一个是将函数display()设计成按引用调用,这样不用生成副本. 另一个是定义一个拷贝构造函数,生成对象副本时将调用拷贝构造函数进行初如化.
为什么参数是&?
防止生成副本,否则死循环,不停调用拷贝构造函数.
如果你不写,编译器是否会为你生成一个默认的拷贝构造函数?
会.但是它进行的只是浅拷贝.
关于派生类构造函数与基类构造函数的调用关系的问题:
派生类不带参数的构造函数会自动调用基类中不带参数的构造函数. 派生类中有参构造函数如果你不指定怎么调用基类的构造函数的话,它会调用默认的无参构造函数.
关于派生类拷贝构造函数与基类拷贝构造函数的调用关系的问题:
如果它们都没有定义~,则编译器会调用它们的默认~.
如果它们都定义了~,但你在定义派生类~时没有显示调用基类的~,那么编译器会调用基类的默认的无参构造函数. 如果显示调用了基类的~,则会被调用.
如果基类定义了~但派生类没定义~,则编译器会调用基类的~.
如果基类没定义但派生类定义了.则编译器会调用基类的默认无参构造函数.
1 拷贝构造函数为private的目的?
深浅拷贝.
2 拷贝构造函数中可以访问同类的其它对象的私有成员.
384

被折叠的 条评论
为什么被折叠?



