本文主要是介绍【初级】C++中的拷贝构造函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
下面的代码哪里有问题?
class Base
{
public:Base() {i = 0;printf("Base()\n");}Base(const Base & base) : i(base.i){printf("Base copy.\n");}void print() {printf("%d\n",i);}int i;
};class Child : public Base
{
public:Child(){j = 1;}Child(const Child &rhs){j = rhs.j;printf("Child copy.\n");}int j;
};int main()
{Child chd(0); chd.i = 10;chd.print();Child cd(chd);cd.print();return 0;
}
问题出在子类的拷贝构造函数中,因为其只拷贝了子类成份,而未拷贝父类成份,不过父类成份被正确地构造了,因为子类拷贝构造函数默认调用了父类的无参构造函数。所以上面的代码的打印输出为:
Base()
10Base()
Child copy.
0
注意:子类的构造函数(包括普通构造函数和拷贝构造函数)只会默认调用父类无参的构造函数,若要调用父类的带参数构造函数,必须要显式在构造函数初始化列表中注明。
所以正确的拷贝构造函数写法应该是:
Child(const Child &rhs) : Base(rhs)
{j = rhs.j;printf("Child copy.\n");
}
此时程序的输出为:
Base()
10Base copy.
Child copy.
10
可见父类成份被正确地复制了。
这篇关于【初级】C++中的拷贝构造函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!