Почему происходит это обращение? - PullRequest
4 голосов
/ 14 сентября 2011
#include<iostream>

using namespace std;

class test
{
  int a, b;
public:

  test() {
    a=4; b=5;
  }

  test(int i,int j=0) {
    a=i; b=j;
  }

  test operator +(test c) {
     test temp;
     temp.a=a+c.a;
     temp.b=b+c.b;
     return temp;
  }

  void print() {
    cout << a << b;
  }
};

int main() {
  test t1, t2(2,3), t3;
  t3 = t1+2;
  t3.print();
  return 0;
}

Как компилятор может принять оператор типа t3=t1+2;, где 2 не является объектом?

Ответы [ 7 ]

7 голосов
/ 14 сентября 2011

Компилятор видит, что вы вызываете operator+(test), и пытается неявно преобразовать 2 в test, успешно используя ваш test(int i,int j=0) конструктор.

Если вы хотите сделать преобразование явным, выдолжен изменить конструктор на explicit test(int i, int j=0).В этом случае ваш код вызовет ошибку компилятора, поскольку 2 не может быть неявно преобразовано в test.Вам нужно изменить выражение на t1 + test(2).

2 голосов
/ 14 сентября 2011

Доступен двоичный файл operator+, который принимает два операнда типа test. Более того, test неявно конструируется из int через конструктор test(int, int = 0). Соединяя их вместе, t1 + 2 становится t1 + test(2, 0).

Чтобы запретить это тихое преобразование (которое иногда может вызвать очень удивительные цепочки преобразования), объявите ваши конструкторы, которые принимают один единственный аргумент как явный: explicit test(int, int = 0).

2 голосов
/ 14 сентября 2011

Поскольку test(int i,int j=0) является конструктором, который принимает один или два аргумента, объект test создается из 2. На следующем этапе test operator +(test c) называется.

1 голос
/ 14 сентября 2011

Поскольку test(int i, int j = 0) не помечено как явное.

Следовательно, t1 + 2 интерпретируется как t1.operator+(2), что само по себе интерпретируется как t1.operator+(test(2)) (неявное преобразование).

Если вы пометите конструктор как explicit, произойдет ошибка (во время компиляции), говорящая о том, что 2 нельзя преобразовать в test или что operator+ не соответствует.

0 голосов
/ 14 сентября 2011

Компилятор создает объект типа Test, используя его конструктор.

 t3 = t1 + test(2);
0 голосов
/ 14 сентября 2011

Поскольку ваш конструктор test(int i,int j=0) вводит пользовательское преобразование из int в test.

0 голосов
/ 14 сентября 2011

Короче говоря, потому что C ++ включает перегрузку операторов , возможность определять пользовательские реализации операторов для пользовательских типов. Функция operator+(), показанная выше, определяет способ определения оператора + для типа test. Когда компилятор видит выражение, в котором + применяется к объекту test, он ищет operator+, определенный в test (или форму с двумя аргументами, определенную как глобальная функция с первым аргументом типа test или test&.) Затем она вызывает функцию, возможно, после преобразования другого аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...