关于构造

qq_29846883 2017-09-22 02:54:31

class mc
{
public:
mc()
:v(0)
,c('\0')
{}
mc(char c_)
:v(0)
,c(c_)
{}

mc(const mc& m_)
{
this->v = m_.v+1;
this->c = m_.c;
}

mc& operator=(const mc& m_)
{
++this->v;
this->c = m_.c;
return *this;
}
public:
char c;
private:
int v;
};
mc fmc()
{
return mc('a');
}
int main()
{
mc m1 = fmc();
mc m2 = mc('b');
mc m3 = m2;
mc m4;
m4 = m3;
return 0;
}


1. m1,m2为什么没有调用重写的赋值构造?它们调用了什么进行了赋值操作?

2.fmc的return mc('a'); 这里返回一个对象, 但是这个对象的作用域只有在这个函数内,
那么它为什么没有在函数结束时无效? 外面依然可以正常获取它的值?
如果return做了深拷贝使它有效的返回给外面使用,那么它为什么没有调用构造函数?
不是的话,那return做了些什么呢?
...全文
357 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2017-09-23
  • 打赏
  • 举报
回复
因为 mc m3 = m2 //这里是初始化,所以调用了拷贝构造函数
qq_29846883 2017-09-23
  • 打赏
  • 举报
回复
感谢大家的回复, 已经有些头绪了,但还是有点没弄清楚. 1.如果m1调用的是赋值初始化(是不是可以相当于m1=std::move(m),是不是可以这么理解?), 那为什么m3它却调用了构造(带参的那个构造)?
destory27 2017-09-22
  • 打赏
  • 举报
回复
mc m1 = fmc(); mc m2 = mc('b'); mc m3 = m2; 这是赋值初始化 是初始化
真相重于对错 2017-09-22
  • 打赏
  • 举报
回复
因为你在fmc中直接 return mc(..); 现在编译器很聪明,没有必要再调用copy construct,直接 把 mc m1 = fmc(); ====> mc m1 = mc("...."); 如果你在 fmc里面 fmc() { mc tmp; tmp.ddde= .. .... return tmp; } 他就会调用copy construct && 右值构造函数 mc( const mc&& rhs);
paschen 版主 2017-09-22
  • 打赏
  • 举报
回复
因为函数是按值传递,函数结束后的返回值是复制传递,销毁前已经进行了复制 如果按值返回对象,编译器会进行返回优化,直接用他构造对象,而不创建临时对象
paschen 版主 2017-09-22
  • 打赏
  • 举报
回复
mc m1 = fmc(); //这里是在创建对象 这样才是赋值:mc m1;m1 = fmc();
sty_app 2017-09-22
  • 打赏
  • 举报
回复
引用 2 楼 sty_app 的回复:
1. m1 m2 初始化调用的是同一个构造函数mc(char c_) 2. m1是调用函数fmc()初始化,而在fmc()中直接返回的是一个mc('a'),此处已经调用了mc(char c_)构造函数 而函数返回值赋值到m1的过程,实际上是将寄存器中保存的临时对象填充至m1的内存区域,详情请参照http://blog.csdn.net/chinabinlang/article/details/19476941 期间对象只会构造一次,编译器默认m1就是在fmc()函数中构造的,可以添加析构函数检查fmc()函数结束时,并没有调用析构 3. 赋值操作符,请添加 if(this == *m_) return *this; 避免自赋值后出现值改变的伪逻辑
修正下 3. 赋值操作符,请添加 if(this == &m_) return *this; 避免自赋值后出现值改变的伪逻辑
sty_app 2017-09-22
  • 打赏
  • 举报
回复
1. m1 m2 初始化调用的是同一个构造函数mc(char c_) 2. m1是调用函数fmc()初始化,而在fmc()中直接返回的是一个mc('a'),此处已经调用了mc(char c_)构造函数 而函数返回值赋值到m1的过程,实际上是将寄存器中保存的临时对象填充至m1的内存区域,详情请参照http://blog.csdn.net/chinabinlang/article/details/19476941 期间对象只会构造一次,编译器默认m1就是在fmc()函数中构造的,可以添加析构函数检查fmc()函数结束时,并没有调用析构 3. 赋值操作符,请添加 if(this == *m_) return *this; 避免自赋值后出现值改变的伪逻辑
  • 打赏
  • 举报
回复
这里有说明: http://en.cppreference.com/w/cpp/language/copy_elision 这一段: T f() { return T{}; } T x = f(); // only one call to default constructor of T, to initialize x

64,646

社区成员

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

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