const关键字的使用

Posted

tags:

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

定义const变量

通常使用const来定义常量,在变量的前面加上const关键字即可如下:

 

const int a;
int const a;    //表示a的值是一个常量,不可以通过赋值的方式来修改

 

在C++中const被当成编译期的常量来处理,也就是说,编译器不为const常量分配空间,只在编译时将它的值保存在名字列表中,当我们通过内存地址间接修改常量的值时,其结果保持不变。代码如下:

#include<stdio.h>
int main()
{
    const int a=1;
    int *p=(int*)&a;
    *p=100;
    printf("a=%d\n",a);
    return 0;
}

其运行结果如下:a=1;

在类与对象中的应用:

在C++中const在类与对象中的应用主要有以下几个场合:

(1):常量数据成员的应用

(2):函数的参数为常量的应用

(3):常量函数的应用

(4):常量对象的应用

常量数据成员的应用

若类中的某个数据成员是常量,表示这个数据成员不能直接被修改,故const数据成员要求初始化,在类中数据成员是不允许在定义时初始化的,类仅仅是一种数据类型,类中的数据成员和成员函数的使用都是通过实例的对象调用,也就是说,有了对象类中的数据成员和函数成员才有了生命,因此const数据成员的初始化应该在对象产生的时刻,即应该在构造函数中初始化,并且const数据成员是在构造函数的初始化表中进行的。程序如下:

class A
{
private:
    int a;
    const int b;                            //const常量
public:
    A(int a, int b):a(a),b(b){}            //const数据成员初始化
    void show()
    {
        cout<<a<<","<<b<<endl;
    }
};
注:const数据成员是必须在构造函数的初始化表中进行!!!!

函数参数为常量的应用方法

类中的函数成员的参数通常使用引用,表示用源头的数据,不会再自己复制一份。当希望传递给函数成员的数据不被破坏,就需要定义成const变量

#include<iostream>
using namespace std;
class A
{
private:
    int a;
    const int b;
public:
    A(int a, int b):a(a),b(b){}
    void show()
    {
        cout<<"a="<<a<<","<<"b="<<b<<endl;
    }
    void set(const int &x)                  //通过引用直接访问x,并且保证x的值不会被篡改
    {
        a=x;
    }
};

int main()
{
    int x=99;
    A a(1,2);
    a.show();
    a.set(x);
    a.show();
    return 0;
}

运行结果:

a=1,b=2
a=99,b=2

常量成员函数与常量对象的使用方法

在C++中,常量函数必须定义在类中,以成员函数的形式出现,常量成员函数的好处就是保证类的封装性,能够有效的防止类的数据成员被非法访问。

常量函数的定义:

int fun(void) const; 

注意:const int fun(void);表示的是该函数的返回值为常量,不可与常量函数混淆!!

上面的常量函数 int fun(void) const 实际上与int fun(void)构成重载关系,重载函数是通过函数的参数或个数不同来构成重载的,int fun(void) const 与int fun(void)构成重载关系是因为this指针,普通函数的this指针是普通指针,而const成员函数是常量指针。

对象调用常量函数规则有以下几个(归根到底就是this指针是常量指针):

1、非常量对象可以调用常量函数

2、非常量对象可以调用非常量函数

3、常量对象可以调用常量函数

4、常量对象不可以调用非常量函数

5、常量函数和非常量函数重载时,非常量对象调用非常量函数

6、常量函数和非常量函数重载时,常量对象调用常量函数

总结:归根到底常量函数还是属于对象的(和static要区分开),故可以被任何对象调用;

           常量对象由于this指针是常量指针,故不可以调用非常量函数(常量函数可以接受非常量,但不可以把常量赋给非常量);

突破常量成员函数修改数据成员的限制

将this常量指针转换为非常量指针

将this常量指针的const属性去掉,可以使用const_cast(去const)运算符完成

将数据成员定义为mutable属性

将数据成员定义为:mutable  int a;就可以间接实现常量函数修改成员数据。

 

以上是关于const关键字的使用的主要内容,如果未能解决你的问题,请参考以下文章

const关键字的使用

C++中const关键字的使用总结

C语言 const使用详解

C语言 const使用详解

C++中的const关键字深入理解(关于引用指针顶层const)

Alfred常见使用