You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C++ Move类add方法返回值初始化对象的疑问

关于Move类对象初始化的疑问解答

相关代码

MOVE.H

class Move{
private:
double x;
double y;
public:
Move(double a = 0, double b = 0); // sets x, y to a, b
void showmove() const;
Move add(const Move &m) const;
void reset(double a = 0, double b = 0); // resets x,y to a, b
};

MOVE.CPP(省略部分方法)

Move::Move(double a, double b)
{ x = a;  y = b;}
Move Move::add(const Move &m) const
{
double m_x, m_y;
m_x = this->x + m.x;
m_y = this->y + m.y;
Move newMove(m_x, m_y);
return newMove;
}

MAIN.CPP(省略部分代码)

Move move1;  // 无参数,构造函数默认x=0,y=0
Move move2(1.5, 2.5); // 构造函数设置move2的x=1.5、y=2.5
Move move3(1.5, 2.1); // 构造函数设置move3的x=1.5、y=2.1
Move move4(move2.add(move3));  // 疑惑点

核心原理

你提到的构造函数只是显式声明的版本,实际上C++会为每个类自动生成一个默认拷贝构造函数,哪怕你没有手动声明它。

这个默认拷贝构造函数的签名为:

Move(const Move& other);

它的作用是用一个已存在的同类型对象初始化新对象,会把源对象的所有成员变量(这里就是x和y)逐一拷贝到新对象中。

当执行Move move4(move2.add(move3));时:

  1. move2.add(move3)返回一个临时Move对象,其x为3.0、y为4.6;
  2. 用该临时对象初始化move4时,编译器会调用默认拷贝构造函数,将临时对象的x和y值拷贝给move4的对应成员,因此得到预期结果。

补充说明

如果显式声明了自定义的拷贝构造函数,编译器就不会再自动生成默认版本。但如果没有声明,编译器会自动提供这个逐成员拷贝的默认拷贝构造函数,这是C++类的默认行为之一。

内容的提问来源于stack exchange,提问作者Ace Blackwell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:40:28