拷贝构造函数还是赋值运算符

// 何时调用拷贝构造函数,何时会调用赋值操作?

//

 

记得Effective C++中有个条款是关于何时调用拷贝构造函数和赋值运算符的,觉得这个知识点挺有意思的,可能也是很多新手包括我自己比较疑惑的地方,所以就研究了一下,下面是分两种情况分别说明了何时调用拷贝构造函数和赋值运算符,当然调用拷贝构造函数的时机很多,这里仅仅列出了一种情况,这一种是比较容易跟赋值运算相混淆的,也就是下面的第3种情况。能想到的就这三种,有知道其它情况的童鞋希望告知,感激不尽。

以下情况都会调用拷贝构造函数:
1. 一个对象以值传递的方式传入函数体 
2.
一个对象以值传递的方式从函数返回 
3.
一个对象需要通过另外一个对象进行初始化。

 

代码段一:调用拷贝构造函数的一种情况

#include "stdafx.h"

#include<iostream>

using namespace std;

class A

{

public:

    A(int a):i_data(a)

 {

     cout<<"constructor of A"<<endl;

 }

 A(const A& t)

 {

     cout<<"copy constructor"<<endl;

     this->i_data = t.i_data;

 }

 void print() const

 {

     cout<<"i_data is:"<<(this->i_data)<<endl;

 }

private:

    int i_data;

};

 

int _tmain(int argc, _TCHAR* argv[])

{

    A a(5);

    A aa = a;

    aa.print();

    system("pause");

    return 0;

}

程序的运行结果:

很明显这种情况调用了拷贝构造函数,因为A aa=a这个是用a来初始化aa,也就是aa在实例化的时候必然要调用构造函数,而且这个时候用另一个对象a来初始化aa,所以要调用拷贝构造函数。

 

调用赋值运算符的情况:


#include "stdafx.h"

#include<iostream>

using namespace std;

class A

{

public:

    A(int a):i_data(a)

 {

     cout<<"constructor of A"<<endl;

 }

 A(const A& t)

 {

     cout<<"copy constructor"<<endl;

     this->i_data = t.i_data;

 }

 void print() const

 {

     cout<<"i_data is:"<<(this->i_data)<<endl;

 }

private:

    int i_data;

};

 

int _tmain(int argc, _TCHAR* argv[])

{

    A a(5);

    A aa(10);

    aa = a;

    aa.print();

    system("pause");

    return 0;

}

 

程序运行的结果:


程序只在主函数中作了很小的改动,但是程序的运行方式发生了显著的变化。很明显这里没有调用拷贝构造函数,仅仅调用了构造函数和赋值运算符,aa=a执行的时候,aa这个对象已经构造出来了,此时只是将a赋值给aa,跟第一种情况用a来初始化aa有明显的不同。

 

总结:

在有对象生成的时候并用另一个同类对象初始化这个要生成的对象的时候调用拷贝构造函数,而在对象已经生成的情况下,则调用赋值运算符

 

 

 

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拷贝构造函数是用来创建一个新对象并将其初始化为给定对象的副本的特殊成员函数。它通常用于以下情况: - 当一个对象通过值传递给函数或以值的形式返回时 - 当一个对象用另一个对象进行初始化时 - 当一个对象作为另一个对象的成员进行初始化时 对于类`Person`的拷贝构造函数,它会接受一个`const Person&`类型的参数,并将其成员变量`name_`赋值给新创建的对象的`name_`成员变量。 赋值运算符是用于将一个对象的值分配给另一个已经存在的对象的成员函数。它通常用于以下情况: - 当一个对象被另一个对象赋值时 - 当一个对象作为另一个对象的成员进行赋值时 对于类`Person`的赋值运算符,它会接受一个`const Person&`类型的参数,并将其成员变量`name_`赋值给当前对象的`name_`成员变量。然后,它将返回一个指向左侧运算对象的引用,以支持连续赋值的操作。 如果在类定义中没有显式定义拷贝构造函数赋值运算符,编译器会为类生成默认的拷贝构造函数赋值运算符。此外,我们还可以使用`=default`来显式要求编译器生成合成的拷贝构造函数赋值运算符。这将使用默认的实现来完成拷贝和赋值操作。 总之,拷贝构造函数用于创建一个对象的副本,而赋值运算符用于将一个对象的值赋给另一个已经存在的对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++拷贝构造函数与拷贝赋值运算符](https://blog.csdn.net/xiongya8888/article/details/89424224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值