struct Test { Test(int){} Test(){} void fun(){cout<<"func"<<endl;} }; int main() { Test a(1); Test b(); //此处是一个函数声明,返回值为Test类型,而不是对象定义! Test b1; //对象定义 Test *c = new Test(); Test *d = new Test(2); a.fun(); b.fun(); //error! c->fun(); d->fun(); return 0; }
其实这个就是C++的语法而已。记住就行。
可以认为缺省构造函数和带参数构造函数在定义对象时使用不同语法形式.
test b 就是一个名为b的test类型的变量
对比built-in type:
int a 就是一个名为a的int型变量,注意这时也没有(),所以为了达到与built-in类型的一致性,对于类类型的无参数定义,也不能加()
如果非写成 test b(); 相当于声明了一个无参函数,返回值为 test对象。如果出现这种错误,编译器并不会报错,直到把b作为实例用时才会出现矛盾。所以出错会在 b.fun() 编译不过。
其实b()这个写法可以用在new上
如: test * b = new test() 跟 test * b = new test 是一样的。都相当于调用 构造函数test();个人认为因为这样可以,所以之前的代码容易让人混淆。 另,如果有C#经验,更容易混。