
比如说
class A
{private:
int a,int b;
public:
A(int a1=0,int a2=0)
{a=a1;a=a2;}//这个时候就调用构造函数了,即在向private成员赋值的时候,会调用构造函数
}
复制构造函数的调用有三种情况,第一种是对一个类得对象赋初值的时候
比如说
class A
{private:
int a,int b;
public:
A(class &B)
{a=Ba;b=Ab;}
第二种是当返回一个类的时候
f()
{
return A;
}
第三种是当想要使一个函数的参数为一个类得时候,那么就会调用复制构造函数
如
f(class& A)
{
}
其实一般情况下,复制构造函数是不用写出来的,只需要调用默认的就可以了,除非是代码中已经有了和指针挂钩的东西,这个时候最好就写出来复制构造函数,否则就会造成悬空的指针,程序会崩掉。
我个人认为拷贝构造函数的形参必须是本类对象的引用,而在此题中是类。
在C++中,下面三种对象需要拷贝的情况。因此,拷贝构造函数将会被调用。
1). 一个对象以值传递的方式传入函数体
2). 一个对象以值传递的方式从函数返回
3). 一个对象需要通过另外一个对象进行初始化
当实现程序时,当一个对象以传递值的方式传入这个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环。 也就是递归!
这显然是错误的!所以拷贝构造函数的形参必须是她的对象的引用。
拷贝构造函数,又称复制构造函数,由编译器调用来完成一些基于同一类的其他对象的构建及初始化。在一个对象以值传递的方式传入函数体时;一个对象以值传递的方式从函数返回时;一个对象用于给另外一个对象进行初始化(常称为赋值初始化)时被自动调用。
拷贝构造函数必须以引用的形式传递(参数为引用值)。当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。
如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。
扩展资料:
使用原则:
通常的原则是:对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;在提供拷贝构造函数的同时,还应该考虑重载"="赋值 *** 作符号。
拷贝构造函数的格式为:
类名(const 类名& 对象名); 拷贝构造函数的原型,参数是常量对象的引用。由于拷贝构造函数的目的是成员复制,不应修改原对象,所以建议使用const关键字。
-拷贝构造函数
不会,拷贝构造本就是构造对象的方法之一,调用了拷贝构造函数,新建的对象就已经创建完毕,不会再调用其它构造函数了。
三种情况下都会调用拷贝构造函数:
1作为函数的对象参数,进行传。当然,不能是引用类型的参数。
2对象作为函数的返回值,注意,返回的也不能是引用类型的。用this返回一个对象,如果函数不
是申明返回引用类型的对象,就会调用复制构造函数,这是对象在堆栈中传递的一个过程。
3用一个对象初始化另一个正在构造的对象。
c++,类的对象作为形参时一定会调用复制构造函数吗?
答:如果参数是引用传递,则不会调用任何构造函数;如果是按值传递,则调用复制构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行是存在,函数执行结束之后调用析构函数。
如果类中没有定义复制构造函数 那对象就不能作为形参?
答:如果没有定义,编译器会自动为你定义一个,编译器自己定义的复制构造函数是按类成员变量的值复制的。有几个成员变量就重新创建一个对象,那个对象的成员变量和被复制的对象其成员变量的值相同。这里如果成员变量有指针的时候,就会出现多个指针指向同一个对象的问题
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)