класс Bar {оператор Foo (); } - PullRequest
       32

класс Bar {оператор Foo (); }

2 голосов
/ 31 декабря 2011

Что означает этот стиль перегрузки операторов?

class Foo {
    Foo(int a) { ... }
};

class Bar {
    operator Foo() { return Foo(25); }
};

Ответы [ 2 ]

10 голосов
/ 31 декабря 2011

Это определенная пользователем функция преобразования, которая неявно преобразует экземпляр Bar в Foo.

Bar bar;

Foo foo = bar;  // bar implicitly converts into Foo.

Как будто вы написали это:

Foo foo = Foo(25);

Если у вас есть такая функция преобразования, то вы можете вызвать ее так:

void f(Foo foo); //a function which accepts Foo

f(bar); // bar implicitly converts into Foo.

Так что такое неявное преобразование может быть нежелательным, поскольку это может вызвать проблемы, приводя к непреднамереннымрезультат.Чтобы избежать этого, вы можете сделать функцию преобразования явной как (только в C ++ 11):

//valid in C++11 only

class Bar {
  explicit  operator Foo() { return Foo(25); }
};

Теперь оба из них выдают ошибку:

Foo foo = bar; //error
f(bar); //error

Однако допускается следующее:

Foo foo = static_cast<Foo>(bar); //Ok
f(static_cast<Foo>(bar)); //Ok
0 голосов
/ 31 декабря 2011

Это перегрузка cast operator.Лучшая документация, которую я мог найти, была MSDN

В основном, если у вас есть Bar, вы можете привести его к Foo, который построен с определенным значением:

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