C++中X x();为何未创建对象?技术咨询
为什么
X x();没有创建X类对象? 嘿,这个问题可是C++里出了名的“最令人头疼的解析”(Most Vexing Parse)场景,我来给你讲明白到底咋回事~
核心原因:编译器把它解析成了函数声明
当你写下X x();或者X x2();的时候,C++编译器并不会把它当成默认构造函数创建对象的语句,而是会优先解析成:
一个名为
x(或x2)的函数声明,该函数没有参数,返回值类型为X。
这是因为C++的语法规则里有一条:当语句的写法同时符合「变量定义」和「函数声明」的语法时,编译器会优先选择函数声明的解析方式。
对比一下正确的对象创建方式
想要调用默认构造函数创建对象,你只需要写:
X x; // 正确:调用X的默认构造函数,创建名为x的对象
如果是C++11及以后的版本,还可以用列表初始化来避免这种歧义:
X x{}; // 正确:明确创建对象,不会被解析成函数声明
代码示例验证
咱们用一段代码来实际看看区别:
#include <iostream> class X { public: X() { std::cout << "X的构造函数被调用啦!" << std::endl; } }; int main() { X x(); // 这是函数声明,不会触发构造函数 X x2; // 这是对象定义,会调用构造函数 X x3{};// C++11及以后的写法,也会调用构造函数 // 如果你尝试写 x.someMember(); 编译器会报错,因为x是函数名不是对象 return 0; }
运行这段代码,你会看到控制台输出两次构造函数的提示,对应x2和x3,而x完全不会触发构造。
额外补充:怎么强制创建临时对象?
如果确实需要用类似()的写法创建临时对象(比如作为函数参数),可以用括号包裹起来,改变解析优先级:
func( (X()) ); // 这里的(X())会被解析成临时X对象,而非函数声明
内容的提问来源于stack exchange,提问作者Jochman
相关产品推荐
相关产品推荐

