一个变量声明创建多个实例

Pet*_*ter 2 c++

这是一个简单的例子:

class A {
public:
  A() {
    printf("%p C1\n", this);
  } 
  A(const char* p) {
    printf("%p C2\n", this);
  }
};

int main(int argc, char *argv[]) {
  A a;
  a = "abc";
}
Run Code Online (Sandbox Code Playgroud)

在代码中,虽然A只声明了一次,但有两个A创建实例.构造函数被调用两次.我可以在VS 2013和gnu C++中重现这一点.

想知道这种行为是错误还是规范的一部分.

jua*_*nza 6

它是规范的一部分.当你这样做:

a = "abc";
Run Code Online (Sandbox Code Playgroud)

使用构造函数在RHS上的表达式A创建临时对象.这用于指定值."abc"A(const char* p)a

如果你这样做了

A a = "abc";
Run Code Online (Sandbox Code Playgroud)

你只会看到一个构造函数调用.

  • 为了完整性,您可以重载`operator =(const char*)`来接管赋值,提供比创建临时对象更好的匹配. (3认同)