18

カスタム関数ビルドをCustomStringという文字列クラスに記述する必要があるというニーズを満たすために、std::string を拡張しました。

コンストラクターを定義しました:

    class CustomString : public std::string {
    public:
        explicit CustomString(void);
        explicit CustomString(const std::string& str);
        explicit CustomString(const CustomString& customString);
        //assignment operator
        CustomString& operator=(const CustomString& customString);
    ... };

3 番目のコンストラクター (コピー コンストラクター) と代入演算子で、その定義は次のとおりです。

CustomString::CustomString(const CustomString& customString):
    std::string(static_cast<std::string>(customString)) 
{}
CustomString& CustomString::operator=(const CustomString& customString){
    this->assign(static_cast<std::string>(customString));
    return *this;
}

これは「明示的」であるためです。つまり、別の CustomString オブジェクトに割り当てるには明示的なキャストが必要です。割り当てについて不平を言っています。

CustomString s = CustomString("test");

明示的にキャストが必要な場所が正確にわかりません。

コピーコンストラクターが明示的でない場合、コードは問題なく機能しますが、「適切なキャストを推測する」のではなく、明示的な定義を知り、実装したいと思います。

4

2 に答える 2

43

明示的なコピー コンストラクターは、コピー コンストラクターが暗黙的に呼び出されないことを意味します。これは、式で発生することです。

CustomString s = CustomString("test");

この式は文字通り、次のことを意味します: を受け取るCustomStringコンストラクターを使用して一時的なを作成しますconst char*。のコピー コンストラクターを暗黙的に呼び出して、CustomStringその一時ファイルから にコピーしsます。

ここで、コードが正しかった場合 (つまり、コピー コンストラクターが明示的でない場合)、コンパイラーは一時オブジェクトの作成を回避sし、文字列リテラルで直接構築することによってコピーを省略します。ただし、コンパイラは、構築が実行可能であることを確認する必要があり、そこで失敗します。

コピー コンストラクターを明示的に呼び出すことができます。

CustomString s( CustomString("test") );

ただし、一時的なものを完全に避けて、次のもので作成することをお勧めしsますconst char*

CustomString s( "test" );

とにかくコンパイラが行うことは...

于 2012-07-14T02:57:52.917 に答える
6

std::string には仮想デストラクタがないため、 std::string からの派生は安全ではありません。あなたの質問に関して-次のような使用を可能にするために、コピーコンストラクターを明示的にしないでください。

CustomString s = "test";

また、コピーコンストラクターを明示的に宣言する必要がないため、なぜ明示的に宣言する必要があるのか​​ わかりません。CustomString オブジェクトを次のように宣言した場合にのみ、明示的なコピー コンストラクターが機能します。

CustomString s(CustomString("test"));
于 2012-07-14T02:32:31.470 に答える