zoukankan      html  css  js  c++  java
  • C++中const关键字用法总结

    看完了c++ primer的基础篇,对const还是有点陌生,在这里小小地总结一下吧。

    1) const与变量

    在变量的定义前加上 const 修饰符即可完成const对象的创建。

    const int val = 5;
    

    const变量的值不能改变

    val = 5;    //error:assignment of read-only variable 'val'
    

    需要注意的是,const变量必须初始化,因为一旦定义了const变量,其值便无法改变,故必须有初始值。

    const int val2; //error:uninitialized const 'val2'
    

    默认状态下,const对象仅在文件内有效

    //file1.cc
    const int val3 = 5;
    int val4 = 6;
    
    //file2.cc
    //...
    extern const int val3;
    extern int val4;
    cout << val3 << endl; //error:undefined reference to 'val3'
    cout << val4 << endl; //ok
    

    如果需要多个文件共享const变量,则只需在其声明和定义前加上关键字 extern 即可。

    //file1.cc
    extern const int val3 = 5;
    int val4 = 6;
    
    //file2.cc
    //...
    extern const int val3;
    extern int val4;
    cout << val3 << endl; //ok
    cout << val4 << endl; //ok
    

    2) const和指针

    const double pi = 3.14; //double常量
    double *ptr = &pi;  //错误,double指针不能指向const double变量
    const double *cptr = &pi; //正确,const double指针也可指向double变量
    *cptr = 3.15; //错误,*cptr是const double类型,不能修改
    
    double dval = 3.14;
    cptr = &dval; //ok
    *cptr = 3.15; //error
    
    int errNumb = 0;
    int *const curErr = &errNumb;   //const pointer
    const double *const pip = &pi;
    

    顶层const表示指针本身是个常量

    底层const表示指针所指的对象是一个常量

    3) const与函数

    void fcn(const int i){//...}
    //fcn能够读取i,但不能修改i
    

    函数设计时,对于较复杂的非内置类型应该尽量使用常量引用,值传递会造成不必要的浪费。

    void func(string&);
    const string str;
    
    func(str);//error
    func("something")//error
    

    如上例,如果只是想使用字符串的值,则形参类型应为const string&,否则会限制所能接受形参的类型,并会给人一种误导,即函数可以修改它的实参的值。

    4) const与类

    使用const限定符修饰类的对象,则在该对象的整个生命周期中,其数据成员永远不会被更改。

    const class_name object;
    

    在类的函数成员声明中,如果在参数列表后面加上const,就说明这个函数不能修改对象的任何数据成员(mutable成员除外,其值总是能够被修改),const可以理解为修饰隐式传入函数的this指针。

    struct A {
        void func() const { val = 0; } //error
    private:
        int val;
    }
    
  • 相关阅读:
    Linux下vi和vim模式相互切换
    Linux文件系统目录
    华硕笔记本(UEFI)支持U盘启动
    什么是RSS feed?订阅RSS有什么好处?
    JSTL的时间格式化标签的使用
    token session区别 以及JWT无状态token
    c++ 重载成员函数的地址如何获取
    c++ __VA_ARGS__
    协程任务调度器
    yield return 1
  • 原文地址:https://www.cnblogs.com/ark2000/p/11300570.html
Copyright © 2011-2022 走看看