关于构造函数的问题。求解答

dahua010 2015-10-21 11:03:44
先看我的示范代码

#include "stdafx.h"
#include<iostream>
#include<vector>

using namespace std;
int aaa = 0;

class A
{
public:
A()
{
m_a = aaa++;
printf("gouzao %d\n", m_a);
}

A(int a)
{
m_a = aaa++;
printf("带参构造 %d\n", m_a);
}

A(A &a)
{
//m_a = aaa++;
printf("拷贝构造 %d\n", m_a);
}

A& operator=(A &a)
{
m_a = aaa++;
printf("等号重载 %d\n", m_a);
return *this;
}

~A()
{
printf("exit %d\n", m_a);
}

void print()
{
printf("m_a = %d\n", m_a);
}

private:
int m_a;
};

A func(A a)
{
return a;
}

int main()
{
func(2); //写法1
//A a = func(2); //写法2

return 1;
}


代码中,如果按照main函数中的写法1,注释掉写法2. 则输出可以看到,会调用2次拷贝构造函数。
也就是当作为func的参数的时候会调用一次。当作为返回值的时候,还回调用一次。这个我是理解的。

但是当我采用写法2,注释掉写法1的时候,我认为在main()函数中A a = 这里还应该在调用一次拷贝构造函数。
但是输出结果确还是只调用了2次拷贝构造函数,包括函数执行完了以后的析构也是只看到调用了2次。
这里就不明白了。为什么最后的那次没有调用?求解答
...全文
145 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fefe82 2015-10-21
  • 打赏
  • 举报
回复
引用 3 楼 dahua010 的回复:
[quote=引用 2 楼 paschen 的回复:] 没问题啊,func(2)这里调用一次,A a = 这里一次,所以两次 另建议看:《深度探索C++对象模型》这本书
这本书看过好多次了。 你的意思是A a = 这里调用了,所以省略的是return的那一次么?确定??[/quote] 省略了哪一次并不重要,重要的是在这种情况下可以省略到只做一次拷贝。
dahua010 2015-10-21
  • 打赏
  • 举报
回复
引用 1 楼 fefe82 的回复:
copy elision 满足特定的条件下,copy/move 构造的调用可以被省略。 http://en.cppreference.com/w/cpp/language/copy_elision
是编译器做的优化么?我研究下这段文章。。
fefe82 2015-10-21
  • 打赏
  • 举报
回复
另外你的 copy constructor 写的不好,参数应该是 const A& ,否则无法通过编译。
dahua010 2015-10-21
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
没问题啊,func(2)这里调用一次,A a = 这里一次,所以两次 另建议看:《深度探索C++对象模型》这本书
这本书看过好多次了。 你的意思是A a = 这里调用了,所以省略的是return的那一次么?确定??
paschen 版主 2015-10-21
  • 打赏
  • 举报
回复
没问题啊,func(2)这里调用一次,A a = 这里一次,所以两次 另建议看:《深度探索C++对象模型》这本书
fefe82 2015-10-21
  • 打赏
  • 举报
回复
copy elision 满足特定的条件下,copy/move 构造的调用可以被省略。 http://en.cppreference.com/w/cpp/language/copy_elision

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧