鱼C论坛

 找回密码
 立即注册
查看: 4053|回复: 7

c++用临时对象来初始化一个新创建的对象,会调用复制构造函数还是重载operator=()函数

[复制链接]
发表于 2013-10-24 21:27:59 | 显示全部楼层 |阅读模式
9鱼币
#include <iostream>
using namespace std;
class A
{
public:
A(int x):i(x)
{
  cout << "构造A.\n";
}
A(const A&x)
{
  i=x.i;
  cout << "复制构造A.\n";
}
~A()
{
  cout << "析构A.\n";
}
void print()const
{
  cout << i << endl;
}
A operator++()
{
  ++i;
  return(*this);
}
A&operator=(const A&x)
{
  cout << "operator=.\n";
  if(this==&x)
  {
   return(*this);
  }
  else
  {
   i=x.i;
   return(*this);
  }
}
private:
int i;
};
int main()
{
A a(999);
a.print();
A b=++a;
b.print();
}
A b=++a; ++a调用operaot++()函数返回的临时对象怎么赋给对象b???求解。

最佳答案

查看完整内容

“初始化”一个对象就一定是调用构造函数。用一个对象初始化另一个对象,就是调用一种叫做“拷贝构造函数”的构造函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-24 21:28:00 | 显示全部楼层

“初始化”一个对象就一定是调用构造函数。用一个对象初始化另一个对象,就是调用一种叫做“拷贝构造函数”的构造函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-24 21:55:47 | 显示全部楼层
A b = ++a;  等价于 A b=(a.operator++())  ,具体的执行顺序就是  执行到这步的时候,先++a,也就是执行a.operator++() , 这时候a.i = 1000了,然后执行拷贝构造函数,用 a初始化b , 其实你的operator=()这个函数在这里没有用上的,不信你可以删了那段函数,再运行一遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-25 17:23:15 | 显示全部楼层
调试的结果只调用了一次复制构造函数.
A operator++()
{
   ++i;
   return(*this);
}
这里按值返回会调用一次复制构造函数.
A b=++a;右边返回的*this赋给左边的对象b,不用调用复制构造函数吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-25 18:08:48 | 显示全部楼层
这是编译器的优化处理,因为编译器看出A b=++a;可以直接用*this对象来(拷贝)构造b,从而省去一个临时对象,所以编译器就这样做了,于是就没有临时对象了。
此外,为什么你的A operator++()不写为A& operator++()呢?还有,为什么有前置++却没有后置++呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-25 20:07:48 | 显示全部楼层
仰望天上的光 发表于 2013-10-25 18:08
这是编译器的优化处理,因为编译器看出A b=++a;可以直接用*this对象来(拷贝)构造b,从而省去一个临时对象 ...

是不是编译器把b作为*this的名字,作为它的标签一样??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-25 21:02:04 | 显示全部楼层
shy_boy 发表于 2013-10-25 20:07
是不是编译器把b作为*this的名字,作为它的标签一样??

不是。如果编译器完全不优化,应该是用*this来初始化一个无名的零食对象,接着用无名临时对象来初始化b。优化后,直接用*this来初始化b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-25 21:19:25 | 显示全部楼层
仰望天上的光 发表于 2013-10-25 21:02
不是。如果编译器完全不优化,应该是用*this来初始化一个无名的零食对象,接着用无名临时对象来初始化b。 ...

哦哦,*this初始化b调用什么函数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 04:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表