C++拷贝构造函数:C++ Primer
PHP中文网
PHP中文网 2017-04-17 15:38:26
0
1
588
itemStr it_str = "123456";

这样的代码应该是拷贝初始化?如果是拷贝初始化,那么在C++ Primer 中文版第五版中441页提到

拷贝初始化是依靠拷贝构造函数或移动构造函数来往成的

但是实际调用的却是itemStr(const char *s)

这是为什么,是书的错误还是编译器的优化操作

itemStr类,如上所写会输出This is normal constructor2.

class itemStr
{
public:
    itemStr() :
        str()
    {
        std::cout << "This is default constructor." << std::endl;
    }

    itemStr(std::string s) :
        str(s)
    {
        std::cout << "This is normal constructor1." << std::endl;
    }

    itemStr(const char *s) :
        str(s)
    {
        std::cout << "This is normal constructor2." << std::endl;
    }
    itemStr(const itemStr &it) :
        str(it.str)
    {
        std::cout << "This is copy constructor." << std::endl;
    }

    itemStr& operator=(const itemStr &it)
    {
        str = it.str;
        std::cout << "This is copy-assignment operator constructor." << std::endl;
        return *this;
    }

private:
     std::string str;
};
PHP中文网
PHP中文网

认证0级讲师

全員に返信(1)
黄舟

この初期化構文はコピー初期化です。コンパイラがコピー省略の最適化を実行するため、コピー/移動コンストラクターは実行時に呼び出されません。コピー/移動コンストラクターに目に見える副作用がある場合でも、コンパイラーはこの最適化を実行できます。その結果、目的の出力を観察できなくなります。

言い換えると、itemStr it_str = "123456"; はコピーの初期化であり、使用可能なコピー/移動コンストラクターが必要です。次のコードは、gcc/clang でコンパイルするとコンパイル エラーを報告します。

リーリー
リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート