const关键字作用

const关键字的作用可以分为以下几类:

  • const与普通内置类型结合、自定义类型结合

  • const与指针/引用的结合

  • const与函数参数的结合

  • const与函数返回值的结合

  • const修饰类的成员函数

const和内置类型、自定义类型的结合

  • const可以和char、int、double、float、long、long long相结合,也可以和自定义类型class、struct相结合。和内置类型普通变量结合会使得普通变量成为一个常量(C语言中成为一个常变量),所以const修饰的变量必须初始化,否则就无法使用;const修饰对象使得该对象变成一个常对象,对该对象有保护其内存不被修改的作用。
#include<iostream>
using namespace std;
int main()
{
    int data1 = 10;
    float data2 = 10.0;
    char ch = 'A';
    data1 = 20;
    data2 = 20.0;
    ch = a;
    cout<<"data1="<<data1<<" data2="<<data2<<" ch="<<ch<<endl;
}

这里写图片描述
现在我们使用const来修饰这些变量:

#include<iostream>
using namespace std;
int main()
{
    char str[] = "hello world";
    const int data1 = 10;
    const float data2 = 10.0;
    const char ch = 'A';
    //data1 = 20;        // error C3892: “data1”: 不能给常量赋值
    //data2 = 20.0;      //error C3892: “data2”: 不能给常量赋值
    //ch = a;            //error C3892: “ch”: 不能给常量赋值
    //const int data3;   //error C2734: “data3”: 如果不是外部的,则必须初始化常量对象
    cout<<str[data1]<<endl;
    cout<<"data1="<<data1<<" data2="<<data2<<" ch="<<ch<<endl;
}

这里写图片描述
从两次运行的结构我们知道const修饰的变量成为了一个常量,他无法做左值即无法修改、必须初始化、可以作为数组的下标使用(C语言与C++const的区别,C语言中不可以做数组下标)

const与指针/引用的结合

  • 由于引用的底层实现机制其实就是指针,所以const修饰指针和引用的作用没有多大区别。const可以和一级、二级(只涉及二级指针)指针相结合,一个const与指针结合有两种意义:1.修饰指针本身;2.修饰指针指向。具体的的意义由const所处位置所决定。

  • const与指针的结合将避免直接或间接修改指针或其指向,const修饰指针本身该指针就成为一个常指针,一经指向一块内存地址就无法再指向其他内存地址;const修饰指针指向的话会对指向的内存地址的数据起保护作用,无法被修改,但该指针可以指向其他内存地址。const与引用的结合会将引用变为一个常引用,可以引用常量。

#include<iostream>
using namespace std;
int main()
{
    int data1 = 10;
    int data2 = 11;
    const int *p = &data1;
    //*p = 20;//error C3892: “p”: 不能给常量赋值
    p = &data2;
    int *const q = &data2;
    *q = 20;
    //q = &data3;//error C3892: “q”: 不能给常量赋值

    //int &b = 20;//error C2440: “初始化”: 无法从“int”转换为“int &”
    const int &c = 20;

    cout << "data1=" << data1 << "  data2=" << data2 << endl;
    cout << "&data1=" << &data1 << endl;
    cout << "&data2=" << &data2 << endl;
    cout << "p = " << p << endl;
    cout << "q = " << q << endl;

    cout << "c=" << c << endl;
    return 0;
}


可以看到无法为*p、q赋值,b也没有办法对20进行引用,但可以对p、*q赋值,也可以用c来引用20。这些都与const修饰与否有关。

const与函数参数的结合

  • 函数参数使用const 表示在函数体中不能对这个参数做修改。strcmp() 函数原型为int strcmp( const char *string1, const char *string2 );用来比较两个字符串的大小,在函数体中不应该改变两个参数的值,所以将它定义为是const 的。const 通常用来限制函数的指针参数,引用和数组参数,而一般形式的参数因为形参和实参本来就不在同一内存空间,所以对形参的修改不会影响实参,因此也没有必要限制函数体不能对参数进行修改。还有就是在类的拷贝构造和赋值运算符重载函数中使用const修饰传入的对象引用是使得该函数可以接收常对象进行拷贝和赋值。
  • const 指针或引用可以接受const 和非 const 地址,但是非const 指针或引用只能接受非const 地址。所以const 指针或引用的能力更强一些,所以尽量多用const 指针或引用,这是一种习惯。

const 与函数返回值的结合

  • 函数返回值为 const 只有用在函数返回为引用的情况。 函数返回值引用常量表示不能将函数调用表达式作为左值使用,例如返回引用的函数 min( )。int & min ( int &i, int &j); 可以对函数调用进行赋值,因为它返回的是左值:min ( a , b )=4;但是,如果对函数的返回值限定为 const 的:const int & min ( int & i, int &j ),那么,就不能对 min ( a, b ) 调用进行赋值了。

const修饰类的成员函数

  • 在类中,可以为类的成员函数进行如下形式的定义:
class Myclass 
{
public:
   int  Getnumber () const;
private:
   int  number ;
};

这里,在函数定义头后面加上的 const 表示这个函数是一个“只读函数”,函数可以由常对象来调用;不能改变对象的状态,不能改变对象的成员变量的值,也就是说,在该函数中const修饰是this指针,他所指向的对象的所有成员方法和数据成员是无法改变的。

发布了62 篇原创文章 · 获赞 68 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/magic_world_wow/article/details/81354187