一个变量声明创建多个实例
One variable declaration creates multiple instances
这里有一个简单的例子:
class A {
public:
A() {
printf("%p C1n", this);
}
A(const char* p) {
printf("%p C2n", this);
}
};
int main(int argc, char *argv[]) {
A a;
a = "abc";
}
在代码中,尽管A
只声明一次,但有两个A
实例正在创建。构造函数被调用两次。我可以在VS 2013以及GNU C++中重现这一点。
想知道此行为是错误还是规范的一部分。
它是规范的一部分。执行此操作时:
a = "abc";
使用 A(const char* p)
构造函数从 RHS 上的"abc"
表达式创建一个临时A
对象。这用于为 a
赋值。
如果你这样做
A a = "abc";
您只会看到一个构造函数调用。
因为您尚未禁用自动生成的赋值运算符或复制构造函数,所以您的类实际上对编译器如下所示:
class A {
public:
A() {
printf("%p C1n", this);
}
A(const A& rhs) { }
A(const char* p) {
printf("%p C2n", this);
}
A& operator=(const A& rhs) { return *this; }
};
所以a = "abc"
被解释为a.operator=( A("abc") )
它期望一个const A&
作为operator=
的参数,它可以构造它,因为你提供了一个构造函数A(const char*)
。
可以通过显式构造函数来防止意外转换。
class A {
public:
A() {
printf("%p C1n", this);
}
explicit A(const char* p) {
printf("%p C2n", this);
}
};
那么这应该无法编译:
int main(int argc, char *argv[]) {
A a;
a = "abc";
}
除非您显式构造:a = A("abc");
相关文章:
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 如何创建 typedef 结构的前向声明
- 使用new创建数组而不声明大小
- 当我可以在头文件中声明和定义所有文件时,为什么要创建一个.cpp文件?
- 我真的可以使用 Type 的每个声明创建一个全局变量吗?
- 如何在类中声明一个变量,该变量将跟踪已创建 c++ 的对象计数
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 声明类的变量而不创建它的实例
- 为什么我们可以创建一个模板类结构,其中包含许多与声明结构时指定的参数不同的参数
- 声明数组时出现 SIGSEGV 错误,而不创建新的 int[size]
- 在类中创建向量(2D 数组)的向量 - Error:C++ 需要所有声明的类型说明符
- 在C++中,如何在没有新元素且不单独声明单个元素的情况下创建"std::initializer_list<base *>"?
- 声明矢量和指针而无需创建任何类型的对象
- 如何创建一个声明来自另一个类的变量的类
- 是否可以在C++中声明基类,以便只能通过创建函数创建从它派生的类
- C++:如何在"for"循环中动态地向文本行添加后缀以创建先前声明的变量
- C :如何声明std ::函数而无需创建成员函数以分配给它们
- 在声明节点创建链接列表时,为什么静态内存分配不起作用
- 创建二次公式求解器-范围中未声明的变量
- 在构造函数中创建数组与在 C++ 中创建声明之间的区别