构造函数调用问题

dodo_check 2013-07-16 12:09:28


class MM {
public:
MM(char *aa) {cout <<"aa:" <<aa <<endl;}
MM(const MM &aa) {cout <<"bb" <<endl;}
MM & operator=(const MM &aa){ cout <<"ccc:" <<endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
MM m = MM("123");
system("pause");
return 0;
}


为什么不输出 bb呢?
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Proteas 2013-07-16
  • 打赏
  • 举报
回复
MM m = MM("123"); MM m2 = MM(m); 这样输出。
www_adintr_com 2013-07-16
  • 打赏
  • 举报
回复
这个不是优化哦, 本来这样写的语法就表示用给定的参数初始化.
dodo_check 2013-07-16
  • 打赏
  • 举报
回复
引用 1 楼 supermegaboy 的回复:
是由于编译器进行了NRVO优化,在m上直接用MM( "123" )构造,不运行复制构造函数。
NRVO貌似是对函数返回值优化的, 这个也是这样么?
飞天御剑流 2013-07-16
  • 打赏
  • 举报
回复
是由于编译器进行了NRVO优化,在m上直接用MM( "123" )构造,不运行复制构造函数。
dodo_check 2013-07-16
  • 打赏
  • 举报
回复
引用 9 楼 mujiok2003 的回复:
或者

MM m="123";
#include <iostream>

using namespace std;

class Test {
public:
  explicit Test(char *str) {
    cout <<"aa:" << str <<endl;
  }
  Test(const Test &str) {
    cout <<"bb:" << endl;
  }
};

int main(int argc, char *argv[]) {
 // Test aa = "123";
 // Test aa("123");
  return 0;
}
Test aa = "123"; Test aa("123"); 请教一下啊,这两种的区别在哪?调用的构造方法不一样么?
mujiok2003 2013-07-16
  • 打赏
  • 举报
回复
或者

MM m="123";
mujiok2003 2013-07-16
  • 打赏
  • 举报
回复
建议写法:

MM m("123");
mujiok2003 2013-07-16
  • 打赏
  • 举报
回复
引用 2 楼 dodo_check 的回复:
[quote=引用 1 楼 supermegaboy 的回复:] 是由于编译器进行了NRVO优化,在m上直接用MM( "123" )构造,不运行复制构造函数。
NRVO貌似是对函数返回值优化的, 这个也是这样么?[/quote] 证明一下:
$ cat main.cpp; g++ -fno-elide-constructors -o demo.exe main.cpp; ./demo.exe
#include <iostream>
using namespace std;

class MM {
public:
        MM(char const *aa) {cout <<"aa:" <<aa <<endl;}
        MM(const MM &aa) {cout <<"bb" <<endl;}
        MM & operator=(const MM &aa){ cout <<"ccc:" <<endl; return *this;}
};


int main(int argc, char* argv[])
{
        MM m = MM("123");
        return 0;
}
aa:123
bb
ri_aje 2013-07-16
  • 打赏
  • 举报
回复
引用 3 楼 adlay 的回复:
这个不是优化哦, 本来这样写的语法就表示用给定的参数初始化.
这个就是优化,c++11 8.5/14 The initialization that occurs in the form T x = a; ... is called copy-initialization.
mujiok2003 2013-07-16
  • 打赏
  • 举报
回复
引用 10 楼 dodo_check 的回复:
[quote=引用 9 楼 mujiok2003 的回复:] 或者

MM m="123";
#include <iostream>

using namespace std;

class Test {
public:
  explicit Test(char *str) {
    cout <<"aa:" << str <<endl;
  }
  Test(const Test &str) {
    cout <<"bb:" << endl;
  }
};

int main(int argc, char *argv[]) {
 // Test aa = "123";
 // Test aa("123");
  return 0;
}
Test aa = "123"; Test aa("123"); 请教一下啊,这两种的区别在哪?调用的构造方法不一样么? [/quote] 一样。
Roth- 2013-07-16
  • 打赏
  • 举报
回复
MM m = MM(MM("123")); system("pause"); return 0; 这样就有BB,你重载了=和复制构造,系统就不会帮你生成默认=和复制构造,所以都只会调用你的

64,637

社区成员

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

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