다음과 같이 내가 불변 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.
이 인쇄됩니다. 과부하가 선택되는 방법을 명확히하십시오. 이 템플릿되지 않으므로
String str {s};
String st(s);
explicit String(const char *Value)
포인터 과부하가 선택되는 이유
문자열 클래스는 다른 불변 C 스타일 문자열로 초기화하는 경우에만 변경 가능합니다. 만약 여러분이 문자의 배열이 일정하지 않고 그 배열로부터'String' 객체를 생성한다면 배열을 수정할 수 있고 불변의'String' 객체도 변경 될 것입니다. –
나는 그것을 지금 깨달았다. 감사! –
@BoPersson 저는 속마귀가 옳다고 생각하지 않습니다. 그것은 부분을 담당하지만 여기에도 다른 것들이 있습니다. – NathanOliver