我想知道为什么构造函数在第一种情况下不会被调用/调用。
#include <iostream>
#include <typeinfo>
class Test{
public:
Test(){ std::cout << "1\n"; };
Test(int){ std::cout << "2\n"; };
};
int main()
{
Test a(); // actually doesn't call the constructor
Test b(1); // "2"
std::cout << (typeid(b).name()) << std::endl; // "4Test"
std::cout << (typeid(a).name()); // "F4TestvE"
return 0;
}
我还发现创建变量的类型名称很奇怪。任何人都可以解释这种行为吗?
我使用mingw gcc 4.7.2 for Windows来编译我的项目
非常感谢。
答案 0 :(得分:2)
Test a();
哦,那是a
的实例化,是Test
类型的对象。
Test a();
哦,那是一个没有参数的函数的声明,返回Test
类型的东西。
哦,等等......
如果您改为构造new a()
或使用(空)初始化列表,则可以避免这种歧义。
有关详情,请参阅Herb Sutter's excellent article。
答案 1 :(得分:0)
Test a();
被解释为名为a
的函数的声明,该函数不接受任何参数并返回类型为Test
的对象。
要创建对象,请删除括号:Test a;
答案 2 :(得分:0)
在测试a()之后删除括号; 它应该像测试一样; 它会自动触发没有参数的构造函数