鱼C论坛

 找回密码
 立即注册
查看: 6405|回复: 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???求解。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-10-25 20:07:48 | 显示全部楼层

是不是编译器把b作为*this的名字,作为它的标签一样??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

哦哦,*this初始化b调用什么函数?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-1 21:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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