奇怪的行为默认构造函数

时间:2018-11-17 02:06:32

标签: c++ class constructor overloading default

有人可以解释为什么在创建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

2 个答案:

答案 0 :(得分:3)

构造成员变量,但默认情况下未初始化。这意味着默认构造的CVector对象将具有未初始化的xy成员,并具有 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)。