在不调用C++中的构造函数的情况下实例化对象

use*_*884 2 c++ constructor

我是C++的新手,我目前正在学习构造函数.假设我有一个带有构造函数的类Dog:

class Dog{
    Dog(){
        std::cout << "Constructor called!
    }
};
Run Code Online (Sandbox Code Playgroud)

我知道在C++中有不同的方法(如果我没有弄错的话)我们可以创建一个对象,例如:

1- Dog dog;
2- Dog dog = Dog();
3- Dog *dog = new Dog;
4- Dog *dog = new Dog();
5- Dog dog();
Run Code Online (Sandbox Code Playgroud)

但事情就是这样:1到4的语句都调用构造函数,但语句编号5没有,我可以找出原因.

你知道为什么第五个语句没有调用类构造函数吗?谢谢.

Ziz*_*Tai 5

5是C++ 最令人烦恼的解析的一个例子.

Dog dog();
Run Code Online (Sandbox Code Playgroud)

这声明了一个名为的函数dog,它不接受任何参数并返回一个Dog.避免 烦恼的解析(如果你使用的是C++ 11),你可以这样做:

Dog dog{};
Run Code Online (Sandbox Code Playgroud)

并且在语义上(至少在C++ 17之前),Dog dog = Dog();将首先创建一个临时对象(Dog()),然后从中移动构造(或复制构造,如果Dog类没有移动构造函数)一个命名对象(dog).尽管编译器可能会优化移动,但此语句确实具有与其余语句不同的语义.

如果我没记错的话,从C++ 17开始,P0135r0会改变语义Dog dog = Dog();,使其具有相同的含义Dog dog;.

编辑:正如@LightnessRacesinOrbit在评论中指出的那样,Dog dog();令人烦恼,但并不是最令人烦恼的解析.Dog dog(Dog());是最令人烦恼的解析.Dog dog();我想,这只是一个简单明了的宣言.