标题:拷贝构造调用时机
一共有三种情况,我们一个一个讲解。
先设置一个初始类防止大家不知道什么是person
class person
{
public:
//person 的无参构造函数
person()
{
cout<<"person 的无参构造函数的调用"<<endl;
}
//person的有参构造函数
person(int a)
{
age=a;
cout<<"person 的有参构造函数的调用"<<endl;
}
//拷贝构造函数:
person(const person &p)
{
age=p.age ;
cout<<"person 的拷贝构造函数的调用"<<endl;
}
//析构函数
~person ()
{
cout<<"person 析构函数的调用"<<endl;
}
int age;
} ;
所有的操作都在类上进行。
第一种情况:使用一个已经创建完毕的对象去初始化一个新对象
就这样使用,上一篇文章我们详细讲了的吧,还有许多细节关于拷贝构造,都在上一篇文章。
第二种情况:值传递的方式给函数参数传值
是不是调用了拷贝构造函数,为什么会调用?我们可以这样理解:因为我们都知道,参数的传递本质是传进去一份零时得副本传递进去。所以需要调用拷贝构造函数。这里说了是值传递对吧,所以我们在函数里面对他进行操作不会改变主函数里面变量的值。换句话说,就是fun(p)和person p中这两个p虽然一样但不是同一个!
值方式返回局部对象
这是vs的:
这是devc++的
如果我们用devc++不会显示拷贝构造,用vs才显示了,但是我们要知道他是会进行这个操作的。
我们来理解理解为什么会出现拷贝构造的调用:第一句话是无参构造吧,我们调用了函数,里面有一个无参构造,所以我们调用了无参构造这一句话对吧。我们都知道,函数的运行在栈区,函数结束后我们会把释放所有创建的东西,那么为什么还会返回一个和p0一样的东西呢?所以,我们在返回的时候将这个p0拷贝到了另外一个地方然后进行返回。这么说并不直观,我们来看看他们的地址就明白了。
先不看其他的,我们就只看地址,并不一样。再来看两个析构,第一个析构很明显就析构的p0;再析构的是p。
看了这个我们可以引出一个易错点:
易错点:不能返回拷贝构造的引用,也就是return &p0;因为上面我们说了这是一个临时变量会被释放。
如有错误,欢迎大家指出。有问题也欢迎在评论区留言。