我是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没有,我可以找出原因.
你知道为什么第五个语句没有调用类构造函数吗?谢谢.
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();我想,这只是一个简单明了的宣言.
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |