13 类对象的声明中加小括号{}和不加小括号{}的区别
Posted 王小东大将军
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13 类对象的声明中加小括号{}和不加小括号{}的区别相关的知识,希望对你有一定的参考价值。
以下代码有什么问题?
struct Test { Test( int ) {} Test() {} void fun() {} }; void main( void ) { Test a(1); a.fun(); Test b(); b.fun(); }
A b.fun()会出错
B Test结构的定义中应该加上public修饰符,才能main函数值调用该类的方法
C Test(int) {}改成Test(int a) {}
D 以上说法都错误
解答:
b.fun(); //b不是Test的实例对象
类是结构体的扩展,在类中封装了对数据成员的操作,缺省的成员为私有的,而结构体为公有的,这就是它们的区别,对构造函数的调用,如果没有参数,是不需要加上括号的,如果加了括号,就不是定义一个对象了,而是声明了一个函数,返回该类型,所以上面的Test b(),实际上是调用一个函数名为b,返回类型为Test的函数,而不是创建了一个对象b,去掉括号后,就是调用的没有形参的构造函数。
本质:类对象的声明中加小括号{}和不加小括号{}的区别:不加小括号{}表示实例化了一个类对象,调用默认构造函数;加小括号{}则表示声明了一个函数,参数为空,返回类型为类类型。
所以,Test b();运行后不会出现问题,而后面的b.fun()由于b不是类对象,不能调用类成员函数而导致编译错误!
Test b();
request for member ‘fun‘ in ‘b‘, which is of non-class type ‘Test()‘默认构造函数直接写 Test b;就可以。
Test a(1); //新建了一个对象
a.fun(); //因此可以调用函数
Test b(); //声明了一个函数,并没有新建对象
b.fun(); //没有新建对象,则不能调用函数
以上是关于13 类对象的声明中加小括号{}和不加小括号{}的区别的主要内容,如果未能解决你的问题,请参考以下文章