std :: string如何分配运算符?

时间:2014-02-08 10:36:30

标签: c++

我试图弄清楚以下语句在C ++中是如何工作的:

std::string a = "simple_text";

首先用空文本初始化“a”对象,然后将“simple_text”分配给它,还是直接用“simple_text”初始化的“a”对象?

我很感激回答。

3 个答案:

答案 0 :(得分:4)

如果未使用关键字explicit定义构造函数,则编译器可以调整

std::string a = "simple_text";

std::string a = std::string("simple_text");

答案 1 :(得分:1)

在这种情况下,它不是=运算符,而是CCTOR。由于a尚未构建,因此必须构建它。

您可以在以下示例中体验:

class Foo{
    int bar;
public:
    Foo(int anInt): bar(anInt){
        std::cout << "CTOR called\n";
    }
    Foo(Foo& aFoo){
        this->bar = aFoo.bar;
        std::cout << "CCTOR called\n";
    }
    Foo& operator=(Foo& aFoo){
        this->bar = aFoo.bar;
        std::cout << "operator = called\n";
        return *this;
    }

};

int main(){
    Foo aFoo(5);
    Foo bFoo = aFoo; // since bFoo is not instantiated yet, the CCTOR constructs it.
    return 0;
}

输出

CTOR called
CCTOR called

答案 2 :(得分:1)

本声明

std::string a = "simple_text";

不是复制赋值运算符。它是对象的定义,因此使用了构造函数。

此声明等同于

std::string a = std::string( "simple_text" );

首先创建一个临时对象std :: string(“simple_text”);使用带有参数const char *的构造函数,然后使用移动构造函数将此对象移动到a。

然而,C ++标准允许消除移动构造函数的调用。所以定义

std::string a = "simple_text";

将等同于

std::string a( "simple_text" );