实例化对象而不在C++中调用构造函数
Instantiating objects without calling the constructor in C++
我是C++的新手,目前正在学习构造函数。假设我有一个带有构造函数的类 Dog:
class Dog{
Dog(){
std::cout << "Constructor called!
}
};
我知道在C++有不同的方法(如果我没记错的话)我们可以创建一个对象,例如:
1- Dog dog;
2- Dog dog = Dog();
3- Dog *dog = new Dog;
4- Dog *dog = new Dog();
5- Dog dog();
但事情是这样的:从 1 到 4 的语句都调用构造函数,但语句编号 5 没有,我可以找出原因。
你知道为什么第五条语句不调用类构造函数吗?谢谢。
Dog dog();
这将声明一个名为 dog
的函数,该函数不接受任何参数并返回Dog
。为了避免
Dog dog{};
在语义上(至少在C++17之前),Dog dog = Dog();
将首先创建一个临时对象(Dog()
),然后从中移动构造(或复制构造,如果类没有移动构造器Dog
则复制构造)一个命名对象(dog
)。尽管编译器可能会优化迁移,但此语句确实具有与其他语句不同的语义。
如果我没记错的话,从 C++17 开始,P0135r0 将更改Dog dog = Dog();
的语义,使其具有与Dog dog;
相同的含义。
编辑:正如@LightnessRacesinOrbit在评论中指出的那样,Dog dog();
令人烦恼,但不是最令人烦恼的解析。 Dog dog(Dog());
是最令人烦恼的解析。 我猜,Dog dog();
只是一个,嗯,简单的声明。
Dog dog();
此行不创建对象,它被解析为函数声明。
如果我没记错的话,它被称为最令人烦恼的解析。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素