2010-12-08 3 views
6

Я просматриваю для своего финала, и я не могу понять, почему этот вопрос является тем, чем он является.Вопрос по классу C++

Предположим следующее объявление класса:

class Testing { 
public: 
     Testing(int n); 
     void Show(const Testing& w, int a = 10); 
     int value; 
private: 
     int DoThis(); 
}; 

Примем следующие строки кода, пытающиеся в основной() программы, и что х имеет тип Testing и был создан propertly.

x.Show(18); легальными или нелегальными

Ответ является законным, я понимаю, что второй параметр не нужен из-за = 10, но так как 18 не типа Testing не то, что недопустимый параметр?

ответ

16

Тестирование имеет конструктор не explicit, который принимает значение int. Следовательно, int может быть неявно преобразован в Testing путем создания временного объекта.

Поскольку выставка занимает const Testing & (а не только Testing &), вы можете передать ей временное. Наконец, второй параметр является необязательным, поэтому вам не нужно указывать значение для этого.

Весь этот механизм, что позволяет сделать это, кстати:

void f(const std::string &str); 
// ... 
f("Hello"); 

Здесь "Hello" имеет тип const char (&)[6], который распадается на const char *, но вы можете построить std::string из const char *, таким образом, позволяя использовать const char *, где необходим параметр std::string.

Имейте в виду, что это создает временное и, следовательно, действует только для параметров, которые передаются по значению или по ссылке const (для ссылок не будет). Кроме того, конструктор не должен быть помечен как explicit.

+0

Спасибо, было несколько хороших ответов, но это очень тщательно. Спасибо, что нашли время, чтобы дать мне объяснение. – dubyaa 2010-12-08 21:23:10

3

Конструктор здесь:

Testing(int n); 

обеспечивает неявное преобразование из int к Testing, и это затем сопоставляет прототип Show, с первым параметром будучи Testing экземпляр, построенный из int 18, а второй параметром является значение 10.

по умолчанию, если предотвратить неявное преобразование, как это:

explicit Testing(int n); 

код не компилируется.

5

Поскольку Testing имеет конструктор, который принимает int, этот c-tor используется для автоматического построения объекта Testing для первого параметра. Код фактически заканчивается рабочим что-то вроде:

x.Show(Testing(18)); 
6

Там есть понятие автоматического преобразования в C++, называемых implicit conversion sequences. Не более одного преобразования в такой последовательности может быть определяемым пользователем, а вызов конструктора для временного объекта является определяемым пользователем преобразованием.Здесь нормально создать временное место, поскольку оно будет привязано к const-ссылке и будет уничтожено, когда вызов Show() будет завершен.

Смежные вопросы