は、次のように私は不変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