c++ - 正在初始化.. 哪个更有效率?

标签 c++ constructor initialization

我有以下问题。应遵循其中哪一项更好,为什么?

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/

相关文章:

c++ - 如何使用谷歌测试抑制由 assert() 引起的运行时错误?

constructor - 使用构造函数参数来评估相互依赖的最终值。 flutter/Dart

java - try/catch 中未初始化的变量,带有未处理的异常

javascript - 如何在 javascript 中查找命名空间构造函数的函数名称?

c++ - 类构造函数参数 C++

java - 实例变量初始值设定项的排序

c++ - QByteArray 获取第n个元素的地址

c++ - 删除 void 指针时未调用析构函数

c++ - 使用与 char 的比较

c++ - (SFML)按下键时播放器构造函数未更新为正确的动画