为何没有构造两次?

月牙尖上 2012-10-21 09:45:38

#include <stdio.h>

class base {
public:
explicit base() {
printf("base constructor \n");
}

~base() {
printf("base destructor \n");
}

void test() {
printf("do test() \n");
}

base(const base& rh) {
printf("int copy constructor \n");
}

base& operator =(const base& rh) {
printf("in assign \n");
return *this;
}
};

base test0()
{
base a;
return a;
}

base& test1() {
base a;
return a;
}

int main() {

base a = test0();//本以为,这会有两次的构造与析构。
a.test();

printf("will be exit \n");
return 0;
}


编译:g++ test.cpp -g
执行:./a.out
输出:
base constructor
do test()
will be exit
base destructor

/************* 环境信息 ******************/

gcc:gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC)
os: centos 6.0 内核:2.6.32-71.el6.i686

/***************************************/

今天写了一个小的测试的程序,用来玩的。
我本以为,test0,这个函数执行的时候,会有两次的构造与析构的操作。可是实际上,却只有一次。
于是,我写了test1()这个函数,这个函数,到是执行了两次构造与析构。(当然,写法是不合法的,只是用来测试用滴)

于是,看c++ Primer,只说是临时对象,但是,那也应该是两次呀。或者,猜测g++做了什么优化吗?
求解!!

因为,平时写的时候,这种情况,一般都是直接用指针的,new后,外面主动释放。
...全文
228 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yisikaipu 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]骚年,你看你的参数,&引用,并不进行构造和析构,你现在应该懂了吧[/Quote]

你可真有想象力

拷贝构造的参数没有&的话,你定义一个试试看

这里是典型的返回值优化,即把
Cls func();
优化为诸如
void func(Cls&);
的形式,以减少构造和析构
漫步者、 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:骚年,你看你的参数,&引用,并不进行构造和析构,你现在应该懂了吧

你可真有想象力

拷贝构造的参数没有&的话,你定义一个试试看

这里是典型的返回值优化,即把
Cls func();
优化为诸如
void func(Cls&);
的形式,以减少构造和析构
[/Quote]

恩,我当时是想的作为返回值进行的一个复制构造,带有&作为引用就不行构造了。我该好好去面壁思过了!!
Binzo 2012-10-21
  • 打赏
  • 举报
回复
本应调用 base& operator =(const base& rh);
漫步者、 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

base a = test0();//本以为,这会有两次的构造与析构。

这是个复制构造函数,而不是=号赋值,所以只会调用一次构造函数了。很简单嘛
晕,我有写copy constraotr了。且,copy构造也是构造函数。
[/Quote]
base(const base& rh) {
printf("int copy constructor \n");
}

骚年,你看你的参数,&引用,并不进行构造和析构,你现在应该懂了吧
linguangliang 2012-10-21
  • 打赏
  • 举报
回复
本质上应该会调用默认构造函数和拷贝构造函数,可能g++编译器优化了吧,vc6.0下会输出拷贝构造函数的信息
月牙尖上 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

base a = test0();//本以为,这会有两次的构造与析构。

这是个复制构造函数,而不是=号赋值,所以只会调用一次构造函数了。很简单嘛
[/Quote]晕,我有写copy constraotr了。且,copy构造也是构造函数。
月牙尖上 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

Return value optimization(返回值优化),跟编译器有关。
[/Quote]哟,这个样子呀。原来叫返回值优化呀!不知道叫法,网上查还真不好查。谢谢了。
漫步者、 2012-10-21
  • 打赏
  • 举报
回复
base a = test0();//本以为,这会有两次的构造与析构。

这是个复制构造函数,而不是=号赋值,所以只会调用一次构造函数了。很简单嘛
mujiok2003 2012-10-21
  • 打赏
  • 举报
回复
Return value optimization(返回值优化),跟编译器有关。
Emiyasstar__ 2012-10-21
  • 打赏
  • 举报
回复
临时对象的产生由编译器定义,很明显被优化了

64,651

社区成员

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

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