вопрос конструктора c ++ - PullRequest
0 голосов
/ 21 июля 2011

Я все еще путаюсь с CTOR:

Вопрос 1:
почему по линии 15 звонят A:A(int) вместо A:A(double&)?

Вопрос 2:
почему в строке 18 не был вызван A:A(B&)?

#include <iostream>
using namespace std;

class B{};

class A{
public:
   A(int )    {cout<<"A::A(int)"<<endl;}
   A(double&){cout<<"A::A(double&)"<<endl;} // it will work if it is A(double), without the &
   A(B&){cout<<"A::A(B&)"<<endl;}
};

int main()
{
/*line 15*/   A obj((double)2.1);  // this will call A(int), why?
   B obj2;
   A obj3(obj2);
/*line 18*/   A obj4(B);          // this did not trigger any output why?
}

Ответы [ 4 ]

6 голосов
/ 21 июля 2011

Строка 15: A(double&) может принимать только значения l, т. Е. Переменные, которые могут быть назначены.(double)2.1 является значением.Используйте A(const double&), если вам также нужно принять значения в качестве ссылки.

Строка 18: B - это тип, а не значение.A obj4(B); объявляет только функцию с именем obj4, которая принимает B и возвращает A.

3 голосов
/ 21 июля 2011

Строка 15

Ваши конструкторы ссылок принимают только ссылки на не const объекты.

То есть вы написали:

A(int)     { cout<<"A::A(int)"<<endl; }
A(double&) { cout<<"A::A(double&)"<<endl; }
A(B&)      { cout<<"A::A(B&)"<<endl; }

вместо:

A(int)           { cout<<"A::A(int)"<<endl; }
A(double const&) { cout<<"A::A(double const&)"<<endl; }
A(B const&)      { cout<<"A::A(B const&)"<<endl; }

Проблема в том, что в A obj((double)2.1) вы вызывали конструкторы с временными объектами (в этом случае двойной литерал 2.1 (приведение к double бессмысленно), и временные объекты могут не связываться со ссылками, которые не являются ссылками на const.

Так что конструктор A(double&) не может быть вызван; единственное, что может совпадать, это A(int), и для ваших данных выполняется необходимое преобразование (2.1 & rarr; 2). (Ваш компилятор обычно предупредит вас , что это происходит.)

Итак, используйте форму конструктора, которая принимает ссылку на const.


Строка 18

Что касается вашего A obj4(B), B - это тип, поэтому вы объявляете функцию с именем obj4, которая принимает (без имени) B и возвращает A.

0 голосов
/ 21 июля 2011

Строка 15, double является rvalue (временным) и не может быть преобразовано в неконстантную ссылку. Для строки 18 наиболее вероятным объяснением является то, что ваш компилятор просто оптимизировал вызов конструктора.

0 голосов
/ 21 июля 2011

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

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