关于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));时:
move2.add(move3)返回一个临时Move对象,其x为3.0、y为4.6;- 用该临时对象初始化
move4时,编译器会调用默认拷贝构造函数,将临时对象的x和y值拷贝给move4的对应成员,因此得到预期结果。
补充说明
如果显式声明了自定义的拷贝构造函数,编译器就不会再自动生成默认版本。但如果没有声明,编译器会自动提供这个逐成员拷贝的默认拷贝构造函数,这是C++类的默认行为之一。
内容的提问来源于stack exchange,提问作者Ace Blackwell
相关产品推荐
相关产品推荐

