c++ const关键字

const 在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。

指定了一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。

  1. 定义常量,值初始化以后就不能再改变了
const int  a = 7;   //在声明常量变量时,必须初始化它们。
const int  b = a + 10; // 正确
a = 8;       // 错误,不能改变

如果我们试图改变它的值,就会得到编译时错误。

  1. 修饰指针变量
int a = 8;
int  b = 7;
const int *p1 = &a;     //const 修饰指针指向的内容,则内容为不可变量。
*p1 = 32; // 错   不可以修改
p1 = &b;  //可以


int* const p2 = &a;  // const 修饰指针,则指针为不可变量。
*p2 = 9; // 正确
p2 = &b; // 错误

const int * const  p3 = &a;  //const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。

3.参数传递和函数返回值

  • 函数参数
    const修饰值传递(内置数据类型),是没有任何必要的。
 void Func(const int a){
        a++;  // error
}

If a function has a non-const parameter, it cannot be passed a const argument while making a call.

void t(int*) 
{ 
    // function logic
}

If we pass a const int* argument to the function t, it will give error.

假设有这样两个函数的定义,使用const对指针和引用进行了限制,这个的意思是传进来的参数必须是const常量吗???

void Func(const string* a) ;
void Func(const strgin& a) ;

其实不是的,在函数形参中加上const,意思是不能在函数中去修改它的值,如果有修改的行为,就会引起错误。

  • 返回值
    修饰值普通类型的值,也是没有必要的,传的是值
const int h()
{
    return 1;
}

int main()
{
    const int j = h();    //ok
    int k = h();            //ok
}

修饰返回的指针或者引用。

const  string& a Func();
const  string& a Func();

const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。

const Tensor Cmf();

4 修饰类成员函数
const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数。

注意:const 关键字不能与 static 关键字同时使用,因为 static 关键字修饰静态成员函数,静态成员函数不含有 this 指针,即不能实例化,const 成员函数必须具体到某一实例。

  1. 修饰类的成员数据
class Test
{
    const int i;
    public:
    Test(int x):i(x)   //需要使用参数列表初始化
    {
        cout << "\ni value set: " << i;
    }
};

int main()
{
    Test t(10);
    Test s(20);
}

  1. 修饰一个对象
    在对象的生存期内,永远不能更改其数据成员。 (不能调用对象的非const成员函数)
const class_name object;

参考链接:
https://www.cnblogs.com/Forever-Kenlen-Ja/p/3776991.html
https://www.studytonight.com/cpp/const-keyword.php

你可能感兴趣的:(c++ const关键字)