c++中在何时调用拷贝构造函数呢,请各位大佬根据我的这个程序指点一二? 拷贝构造函数在哪几种情况下调用
C++:拷贝构造函数在什么时候被调用
1、对象在创建时使用其他的对象初始化
Person p(q); //此时复制构造函数被用来创建实例p
Person p = q; //此时复制构造函数被用来在定义实例p时初始化p
2、对象作为函数的参数进行值传递时
f(p); //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建一个局部对象,与函数内的局部变量具有相同的作用域
需要注意的是,赋值并不会调用复制构造函数,赋值只是赋值运算符(重载)在起作用
p = q; //此时没有复制构造函数的调用!
简单来记的话就是,如果对象在声明的同时将另一个已存在的对象赋给它,就会调用复制构造函数;如果对象已经存在,然后将另一个已存在的对象赋给它,调用的就是赋值运算符(重载)
默认的复制构造函数和赋值运算符进行的都是"shallow copy",只是简单地复制字段,因此如果对象中含有动态分配的内存,就需要我们自己重写复制构造函数或者重载赋值运算符来实现"deep copy",确保数据的完整性和安全性。
拷贝构造函数什么时候被调用?程序以及结果如下:
因为你在func()里面调用构造函数时 A b(4)参数类型为 int ,调用第一个构造函数。
可以这么修改
A func()
{
A b(4);
A d(b);
return d;
}
就没问题了
没看清楚问题,不过我把你的代码直接copy过来,在vs2012 下运行,没有问题,拷贝构造函数被调用,可能是编译环境的问题吧
c++中什么时候调用复制构造函数和析构函数呀?
在创建时调用构造函数
传参,返回值调用复制构造
对象释放时调用析构函数
c++拷贝构造函数何时调用?
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);
--在定义时直接调用函数和先定义后调用,区别在什么地方,没区别,硬要讲的话,就是编译器在给s1复制的时候调用了类似s2复制的方式。