我试图弄清楚以下语句在C ++中是如何工作的:
std::string a = "simple_text";
首先用空文本初始化“a”对象,然后将“simple_text”分配给它,还是直接用“simple_text”初始化的“a”对象?
我很感激回答。
答案 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" );