zoukankan      html  css  js  c++  java
  • 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(); //没有新建对象,则不能调用函数

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    switch语句相关
    大根堆的创建过程
    总结Java中线程的状态及多线程的实现方式
    用直接路径(direct-path)insert提升性能的两种方法
    Oracle的日志记录模式
    针对WebLogic Server 12.1.3版本打补丁
    Oracle Service Bus中的线程
    简化调用Web Service
    网络知识收集
    WebLogic MBean Monitor
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7258839.html
Copyright © 2011-2022 走看看