我有以下问题。应遵循其中哪一项更好,为什么?
string strMyString = "SampleString";
或
string strMyString("SampleString");
提前致谢。
最佳答案
我回答了here
我在这个答案中加入的一件事是:两者都没有使用任何赋值运算符。
不过,对字符串特定内容的简短说明。 std::string
有一个构造函数接受一个参数,该参数接受 char const*
:
// simplified to a normal class declaration. std::string actually
// is a template instantiation.
class string {
public:
string(char const* str) {
// copy over...
}
};
现在你看到有一个构造函数接受一个指向字符的指针。这样它就可以接受字符串文字。我认为以下情况很明显:
string s("hello");
它将直接调用构造函数并初始化s
从而。这称为直接初始化。
另一种初始化变量的方法称为复制初始化。标准说对于复制初始化的情况,其中初始化器不是它正在初始化的对象的类型,初始化器被转换为正确的类型。
// uses copy initialization
string s = "hello";
首先,让我们说明一下类型
-
s
具有类型 std::string -
"hello"
是一个数组,在这种情况下,它又像指针一样被处理。因此,我们将其视为char const*
.
编译器寻找两种方法来进行转换。
- std::string 中有转换构造函数吗?
- 初始化器的类型是否具有返回
std::string
的转换运算符函数? ?
它将创建一个临时的 std::string
通过其中一种方法,然后用于初始化对象 s
通过使用 std::string
的复制构造函数。它看到 std::string
有一个接受初始值设定项的转换构造函数。所以它使用它。最后,它实际上与
std::string s(std::string("hello"));
请注意,您的示例中使用的表单触发了所有这些
std::string s = "hello";
定义一个隐式转换。您可以将构造函数标记为 char const*
如果你想知道你的东西的初始化规则,那么作为你的类型的显式,它不再允许将相应的构造函数用作转换构造函数:
class string {
public:
explicit string(char const* str) {
// copy over...
}
};
然后,使用 copy initialization
对其进行初始化和一个 char const*
实际上现在(以及其他地方)是被禁止的!
现在,如果编译器不支持在各个地方省略临时对象。允许编译器假定复制构造函数复制在此上下文中,并且可以消除临时字符串的额外拷贝,而是将临时 std::string 直接构造到初始化对象中。但是,复制构造函数必须特别可访问。所以,这样做复制初始化是无效的
class string {
public:
explicit string(char const* str) {
// copy over...
}
private: // ugg can't call it. it's private!
string(string const&);
};
现在实际上,只有直接初始化的情况是有效的。
关于c++ - 正在初始化.. 哪个更有效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637259/