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

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

//

 

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

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

 

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

#include "stdafx.h"

#include

using namespace std;

class A

{

public:

    A(int a):i_data(a)

 {

     cout<<"constructor of A"<

 }

 A(const A& t)

 {

     cout<<"copy constructor"<

     this->i_data = t.i_data;

 }

 void print() const

 {

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

 }

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

using namespace std;

class A

{

public:

    A(int a):i_data(a)

 {

     cout<<"constructor of A"<

 }

 A(const A& t)

 {

     cout<<"copy constructor"<

     this->i_data = t.i_data;

 }

 void print() const

 {

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

 }

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有明显的不同。

 

总结:

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

 

 

 

阅读(538) | 评论(0) | 转发(0) |
0

上一篇:小议垃圾回收算法

下一篇:c++中构造函数调用另一构造函数的问题

相关热门文章
  • A5营销团队告诉我的SEO诊断那...
  • 单仁:打造高效性的EMD[原创]...
  • 华美远航(北京)投资有限公司...
  • 明升体育:这回该轮到温格了 ...
  • 连裤衫装 bodycon dresses
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • socket编程开启混杂模式的目的...
  • C++ 嵌套类是干什么的?...
  • C++ 单例怎么写?
  • sizeof 这个操作符都有什么特...
  • Oracle VM server 如何删除vm ...
给主人留下些什么吧!~~
评论热议

你可能感兴趣的:(C/C++)