Предположим, у меня есть непреложный String
класс следующим образом:Разрешение перегрузки: какова роль явного и синтаксиса инициализации?
#include <iostream>
#include <string>
class String
{
public:
explicit String(const char *Value) : Size(std::strlen(Value)), Value(new char[Size + 1])
{
std::memcpy(this->Value, Value, Size + 1);
std::cout << Value << ", novice." << Size << std::endl;
}
template <typename T, std::size_t N> String(const T (&Value)[N]) : Size(N - 1), Value(new char[N])
{
std::memcpy(this->Value, Value, N);
std::cout << Value << ", expert." << Size << std::endl;
}
~String()
{
delete[] Value;
}
private:
const std::size_t Size;
char *Value;
};
void main()
{
auto &s = "Welcome to C++";
String string = s;
String str {s};
String st(s);
return;
}
Я хочу знать роль explicit
пьесы и как синтаксис инициализации делает разницу, когда выбирается перегрузка конструктора.
Я понимаю, что для str
и st
, я явно вызвать конструктор, который принимает указатель на const char
, поэтому они выдают:
Welcome to C++, novice.
Welcome to C++, novice.
Но я не понимаю, почему для string
Welcome to C++, expert.
распечатан. Просьба уточнить, как выбирается перегрузка.
Ваш класс строк является неизменным, если вы инициализируете его с помощью другой неизменной строки стиля C. Если у вас есть непостоянный массив символов и создайте объект String из этого массива, вы можете изменить его, и неизменяемый объект String также изменится. –
Я понял это прямо сейчас. Благодаря! –
@BoPersson Я не думаю, что обман правилен. Он играет роль, но здесь есть и другие вещи. – NathanOliver