有人可以解释为什么在创建temp之后,在temp.x变为2,而temp.y变为1的重载函数中吗?默认构造函数没有参数,因此temp.x和temp.y不应为0或具有怪异数字吗?
谢谢!
// overloading operators example
#include <iostream>
using namespace std;
class CVector {
public:
int x,y;
CVector () {};
CVector (int a,int b) : x(a), y(b) {}
CVector operator + (const CVector&);
};
CVector CVector::operator+ (const CVector& param) {
CVector temp;
cout << " x: -> " << temp.x << " <-";
cout << " y: -> " << temp.y << " <-\n";
temp.x = x + param.x;
temp.y = y + param.y;
return temp;
}
int main () {
CVector foo (3,1);
CVector bar (1,2);
CVector result;
result = foo + bar;
cout << result.x << ',' << result.y << '\n';
return 0;
}
Result: x:-> 2 <- y: -> 1 <-
4,3
答案 0 :(得分:3)
构造成员变量,但默认情况下未初始化。这意味着默认构造的CVector
对象将具有未初始化的x
和y
成员,并具有 indeterminate 值。
由于您打印了这些不确定的值,因此您将获得undefined behavior。
如果您希望默认的构造函数设置特定的值(例如零),则必须显式地进行设置(例如在构造函数初始化器列表中):
CVector () : x(0), y(0) {}
答案 1 :(得分:0)
要添加一些程序员的观点,您还可以在多参数构造函数中使用默认初始化:
CVector (int a = 0, int b = 0) : x(a), y(b) {}
如果您设置了默认的CVector(),它将始终将成员设置为0,但是您仍然可以使用相同的构造函数来完成CVector(5,5)。