C++基础#3:const用法详细介绍

本篇描述了const数据成员在类中的定义及其访问规则。

1. const数据成员的初始化:
(1) 在对象层次上,常量几乎没有任何意义,因此const数据成员通常也是静态的,即用static const来修饰而不是const;
(2) 正如static数据成员一样,satic const数据成员也必须在源文件中为其分配空间并进行初始化,也是最后一次对其赋值的机会。 另外,C++规定,如果数据成员是简单类型(如int,char.....),则允许程序员在声明的同时进行赋值;

(3) 如果真的只用const 而不是static的话,那么,必须在构造函数中以初始化列表的形式对这个const数据成员进行初始化。

例:

#include <stdio.h>

class MaxDefine{
      private:
           int x;
      public:
          //const int MaxDefine_10 = 10;  //compiler error: ISO C++ forbids initialization of member `MaxDefine_10'
          const int MaxDefine_100;     
          static const int MaxDefine_1000;
          static const int MaxDefine_10000 = 10000;

      public:
          MaxDefine(int value ): MaxDefine_100(value)  //必须以这样的初始化列表的形式来进行初始化
          {
              //  MaxDefine_100 = value;//不能这样做,这种写法相当于对常量进行赋值,这不允许,除非是声明的同时进行赋值。
          }

};

int const MaxDefine::MaxDefine_1000 = 1000;

void TestMaxDef(void)
{
     MaxDefine m100(100);
     printf(" m100.MaxDefine_100 = %d /n", m100.MaxDefine_100); // OK: m100.MaxDefine_100 = 100

     printf(" m100.MaxDefine_100 = %d /n", MaxDefine.MaxDefine_100); //expected primary-expression before '.' token. 因为MaxDefine_100属于对象而不属于类。


     printf(" MaxDefine::MaxDefine_1000 = %d /n", MaxDefine::MaxDefine_1000);  // OK: MaxDefine::MaxDefine_1000 = 1000
     printf(" MaxDefine::MaxDefine_10000 = %d /n", MaxDefine::MaxDefine_10000);//OK: MaxDefine::MaxDefine_10000 = 10000
}

int main(void)
{
    TestMaxDef();
    while(1);
    return 0;
}

//result:
/*  MaxDefine::MaxDefine_1000 = 1000;
  MaxDefine::MaxDefine_10000 = 10000;
*/

代码说明:

(1) compiler error: ISO C++ forbids initialization of member `MaxDefine_10':

不能对数据成员在初始化时进行赋值操作,即使赋值0也不可以。

 

2. const数据成员与const成员函数:
(1)不能将静态方法声明为const,因为这是多余的。静态方法根本没有相应的类实例,因此它们不可能修改内部值。
(2)非const对象可以调用const和非const方法,但是,const对象只能调用const方法。

 

例:

#include <stdio.h>
class Widget {
      private:
          int h; //height
          int w; //width
          static const int hMax = 320;
          static const int wMax = 240;
      public:
          Widget(int height, int width):
                h(height < hMax ? height: hMax),
                w(width < wMax ? width: wMax)
          {
                //nothing
          }
         
          int get_height() const;
          int get_width() const;
         
          void printSize()
          {
               printf(" printSize: height = %d /n",  h);
               printf(" printSize: height = %d /n",  w);
          }
};

int Widget::get_height() const { return h; }
int Widget::get_width() const { return w; }

int main(void)
{  
    Widget window(128, 240);
    const Widget window2(116,116);
   
    printf(" window.get_height() = %d /n", window.get_height());
    printf(" window.get_width() = %d /n", window.get_width());
    window.printSize();
    printf("/n");

    printf(" window2.get_height() = %d /n", window2.get_height());
    printf(" window2.get_width() = %d /n/n", window2.get_width());
    //window2.printSize(); //compile error:passing `const Widget' as `this' argument of `void Widget::printSize()' discards qualifiers
   
    while(1);
    return 0;
}
//result:
/*
 window.get_height() = 128
 window.get_width() = 240
 printSize: height = 128
 printSize: height = 240
 
 window2.get_height() = 116
 window2.get_width() = 116
*/        

代码说明:

compile error:passing `const Widget' as `this' argument of `void Widget::printSize()' discards qualifiers:

编译错误,因为widget2是const数据成员,那么,它只能访问const成员函数,而不能访问非const成员函数。

3. 有用链接:

以上描述了const数据成员在类中的定义及其访问规则,而其它更加详细的用法,请参考以下文章:

http://blog.chinaunix.net/u3/96369/showart_2054536.html

http://www.yuanma.org/data/2007/0429/article_2549.htm

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值