C/C++ const 浅析

1. C中的const

    C中的常量总是占用存储,而且他的名字是全局符。C编译器不能把const看作编译期间的常量。
    eg:
        const int buffersize = 100;
        char buffer[buffersize];
    上述代码是错误的。

2. C++中的const

    C++中的const默认为内部连接的。当定义一个const时,必须给他赋值,除非使用extern。
        const int buffersize;            //wrong
     通常C++不为const创建存储空间,但是也有很多特殊情况。


2.1 常量与指针

    A)  常量
        eg:
            const int i = 1;    //推荐使用这个表示方式
            int const i = 1;     //两种表示方式表示同一个意思
        
    B)指针 常量  [const 指针-- Think in C++中这么称呼] (指针本身为const,即指针指向的内存位置为const,但是内存内容不是const)
        eg:
            int a, b;
            int * const p = &a;
            // p = &b;   error!!!
    C ) 常量指针 [指向const的指针 -- Think in C++中这么称呼 ](指针指向的内存地址可变,但是指针指向的内容为const)
        eg:
            const int * p;        //此处不需要初始化,因为p是一个变量,只是其指向的内存内容不能变化,即内存内容为const)
            const int a = 1;
            p = &a;
    D ) 指向const内容的const指针(指针指向的内存地址为const,指针指向的内存内容也不能变)
        eg:
            const int a = 10, b = 20;
            const int * const p = &a;        // a的内容不可变。
            //p = &b;     error!!!   p指向的内存地址也不可变。

2.2 常量与函数


    A) 传递const值
            void f1( const i){
                i++;     // ERROR !!!
            }
        此处相当于做了约定,变量初始值不会被函数f1()改变。由于参数是按值传递的,所以此处的约定对于函数调用者来说是隐式的。

    B) 返回const值
            const int g( );
          这种使用方式对于C++内部定义类型而言没有任何意义,具体参见下面的例子。
            int f3( ) { return 1; }
            const int f4( ) {return 1;}
            void main( )
            {
                const int j = f3( );    // it works!
                int k = f4( );            // it works too!
            }
            但是对已自定义的用户类型而言,按值返回常量是很重要的。如果一个函数按值返回一个类对象为const时,这个函数的返回值不能使一个左值(即它他不能被赋值,也不能被修改)!
    C ) 传递const指针
        eg:
            void f5( const int *p){
                *p = 2;            // Error!!!    试图修改p指针指向的内容        
                int a = *p;
            }

2.3 const对象与成员函数

    
    class X{
        int a;
    public:
        X( int i ) ;
        int f( )  const;
        int g( );
    }

    X::X ( int i ) : a( i ) {  }
    X::f ( )  const { return a; }
    X::g( ) { a++; return a; }

    int main( ) {
        X x1( 10 );
        const X x2 ( 20 );
        x1.f( );
        x2.f( );
        x1.g( );
        //x2.g( );     //Error!!!
    }

    如果申明一个成员函数为const函数,代表该成员函数可以被const对象调用。
    如果不做申明,则不能被const对象调用。
    同时仅申明函数为const是不够的,还需要在定义中再次显式说明此成员函数为const。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值