const修饰符

Posted narjaja

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const修饰符相关的知识,希望对你有一定的参考价值。

一、const声明常量

类型前加const修饰符可声明常量。

1、const在类型前面

const int value;                  //value是const
const char *value;                //*value是const, value可变
const (char *) value;            //value是const,*value可变
char* const value;               //value是const,*value可变
const char* const value;     //value和*value都是const

2、const在类型后面

int const value;                // value是const
char const * value;             // *value是const, value可变
(char *) const value;          //value是const,*value可变
char* const value;             // value是const,*value可变
char const* const value;    // value和*value都是const

3.总结

const在左侧指针所指的值不可改变,const在右侧指针不可改变。

二、const与函数

1.用const修饰函数的参数

函数参数类型前加const指明该参数为常量,在函数内部不可改变。

void func(const int x) {
    //x不可以在内部进行赋值等操作.
}

注:当参数为引用传递或者指针传递作为输出时,都不能加const

2.用const修饰函数的返回值

  • “值传递”函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。
  • ”址传递”函数返回值只能被赋给加const修饰的同类型指针。
const int* func(void) //函数声明
...
int* a = func();             //报错
const int* b = func()    //正确
  • 函数引用返回
const int& func(void) //函数声明
...
int a = func();             //正确
const int& b = func()  //正确
int& c = func()           //报错 

3const 成员函数

任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误。

class test
{
public:
    void func(){}
    int getNum(void) const // const 成员函数
    {
        ++num;     // 编译错误,企图修改数据成员m_num
        func();     // 编译错误,企图调用非const函数
        return num;
    }
private:
    int num;
};

以上是关于const修饰符的主要内容,如果未能解决你的问题,请参考以下文章

const修饰符使用

const修饰符

如何在LLVM中检测const修饰符?

函数后面的const修饰符的作用

static extern const修饰符

C++中 容易忽视的const 修饰符