#c #class
Вопрос:
Я готовлюсь к своему финалу, и я не могу понять, почему этот вопрос такой, какой он есть.
Предположим следующее объявление класса:
class Testing {
public:
Testing(int n);
void Show(const Testingamp; w, int a = 10);
int value;
private:
int DoThis();
};
Предположим, что следующие строки кода выполняются в программе main (), и что x имеет тип Testing
и был создан надлежащим образом.
x.Show(18);
Законно или Незаконно
Ответ законен, я понимаю ,что 2-й параметр не нужен из-за = 10
, но поскольку 18
он не относится к типу Testing
, разве это не недопустимый параметр?
Ответ №1:
В тестировании есть explicit
неконструктор, который принимает значение int. Следовательно, int может быть неявно преобразован в a Testing
путем создания временного объекта.
Поскольку Show принимает значение a const Testing amp;
(и не только a Testing amp;
), вы можете передать ему временное значение. Наконец, второй параметр является необязательным, поэтому вам не нужно указывать для него значение.
Кстати, весь этот механизм позволяет вам это делать:
void f(const std::string amp;str);
// ...
f("Hello");
Здесь "Hello"
имеет тип const char (amp;)[6]
, который распадается на a const char *
, но вы можете построить a std::string
из a const char *
, что позволяет использовать a const char *
там, где std::string
необходим параметр.
Имейте в виду, что это создает временное значение и, следовательно, допустимо только для параметров, которые передаются по значению или по ссылке const (для ссылок это не сработает). Кроме того, конструктор не должен быть помечен как explicit
.
Комментарии:
1. Спасибо, было несколько хороших ответов, но это очень тщательно. Спасибо, что нашли время дать мне объяснение.
2. Тип
"Hello"
естьconst char(amp;)[6]
, который распадается на аconst char*
.
Ответ №2:
В C существует понятие автоматических преобразований, называемых неявными последовательностями преобразования. Не более одного преобразования в такой последовательности может быть задано пользователем, и вызов конструктора для временного объекта является определяемым пользователем преобразованием. Можно создать временное здесь, так как оно будет привязано к ссылке const и уничтожено по завершении вызова Show ().
Ответ №3:
Поскольку Testing
имеет конструктор , который принимает int
, что c-tor используется для автоматического построения Testing
объекта для первого параметра. Код на самом деле заканчивается чем-то вроде:
x.Show(Testing(18));
Ответ №4:
Конструктор здесь:
Testing(int n);
обеспечивает неявное преобразование из int
в Testing
, и это затем соответствует прототипу для Show
, причем первым параметром является Testing
экземпляр, созданный из int
18, а вторым параметром является значение по умолчанию 10.
Если вы предотвратите неявное преобразование, подобное этому:
explicit Testing(int n);
код не будет компилироваться.