实例化对象而不在C++中调用构造函数

Instantiating objects without calling the constructor in C++

本文关键字:调用 构造函数 C++ 对象 实例化      更新时间:2023-10-16

我是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 没有,我可以找出原因。

你知道为什么第五条语句不调用类构造函数吗?谢谢。

5 是C++最令人烦恼的解析示例。
Dog dog();

这将声明一个名为 dog 的函数,该函数不接受任何参数并返回Dog 。为了避免

烦人的解析(如果您使用的是 C++11),您可以执行以下操作:
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();

此行不创建对象,它被解析为函数声明。

如果我没记错的话,它被称为最令人烦恼的解析