问题1>第1行的使用是否优于第2行?
boost::shared_ptr<string> shpStr = boost::make_shared<string>(); // Line 1
boost::shared_ptr<string> shpStr = boost::make_shared<string>(string("")); // Line 2
问题2&gt;一般来说,我们应该总是使用第1行而不是第2行吗?
boost::shared_ptr<Object> shpStr = boost::make_shared<Object>(); // Line 1
boost::shared_ptr<Object> shpStr = boost::make_shared<Object>(Object()); // Line 2
其中Object是具有默认构造函数的类。
答案 0 :(得分:7)
第1行的使用是否优于第2行?
是。第一个说明了它的含义:创建一个共享的,默认构造的字符串。第二个添加一些不必要的噪声(从空字符串文字中创建一个字符串,然后通过复制它来创建另一个字符串),以及可能不必要的运行时开销,以实现相同的效果。
一般来说,我们应该始终使用第1行而不是第2行吗?
是。创建一个临时复制和销毁它是没有意义的,而不仅仅是创建你真正想要的对象。
答案 1 :(得分:3)
make_shared
会将其所有参数传递给它创建的对象的构造函数。那么将会发生以下情况:
make_shared
只会调用new string();
string
的临时""
,即一个空字符串。我们称之为tmp
。现在make_shared
会将其传递给新创建的string
,即调用类似new string(tmp)
的内容,即总共new string(string(""))
。所以你调用string的char const*
构造函数,然后是复制构造函数,只是为了创建一个空字符串。矫枉过正,不是吗?