Конструктор по умолчанию для странного поведения - PullRequest
0 голосов
/ 17 ноября 2018

Может кто-нибудь объяснить мне, почему в функции перегрузки после создания 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 голосов
/ 17 ноября 2018

Чтобы добавить к тому, что сказал программист, вы также можете использовать инициализацию по умолчанию в конструкторе с несколькими аргументами:

CVector (int a = 0, int b = 0) : x(a), y(b) {}

в случае, если вы сделали CVector () по умолчанию, он всегда установит для членов значение 0, но вы все равно можете выполнить CVector (5,5) с тем же конструктором.

0 голосов
/ 17 ноября 2018

Переменные-члены создаются, но не инициализируются по умолчанию. Это означает, что созданный по умолчанию объект CVector будет иметь неинициализированные элементы x и y с неопределенными значениями.

Поскольку вы печатаете эти неопределенные значения, у вас будет неопределенное поведение .

Если вы хотите, чтобы конструктор по умолчанию устанавливал определенные значения (например, ноль), то вы должны сделать это явно (например, в списке инициализатора конструктора):

CVector () : x(0), y(0) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...