关于常量(包括常成员函数与this指针)

意义

利用编译机制防止程序员出错

尤其在函数传参时,你不知道哪天你自己脑残或者其他人维护你代码时不了解情况,把一个没必要修改的值修改了,有可能会出现难以检查的错误。

只读区域效率高、不分配空间

常量通常不会被分配空间,一般保存在符号表中,这样一来效率提高,因为不用读内存,二来节省了空间。

使用

声明

const int a = 10;

必须被初始化
这不废话吗? 前面不初始化,后面又不能赋值,那这个量怎么用啊?

常量与指针

几个指针间的关系

指针常量

本质

这是一个指针,这个指针是一个常量

保护对象

指针与变量之间的指向关系

使用
int a;
int * const p = &a;

常量指针

本质

这也是一个指针,这个指针指向常量

保护对象

指针指向的内容

使用
const int x;
const int *p1 = &x;
int const *p2 = &x;
int y;
const int *p3 = &y;
int const *p4 = &y;
指向常量的指针常量
就是常量指针+指针常量

双重保护:这个指针的指向关系被保护,这个指针指向的内容也被保护

const int x;
const int * const p1 = &x;
int const * const p2 = &x;
int y;
const int * const p3 = &y;
int const * const p4 = &y;

传递过程中修改权限不能放大

常成员函数

使用

class test
{
    int n = 8;
public:
    void f()const
    {
        cout << n << endl;
    }
};

这里的f()就是一个常量成员函数,加了这个const说明这个函数不能对类里的数据进行修改,只能读取

this指针与常成员函数

thiis指针

  1. 一个类的数据成员的每个对象都分配的,但是成员函数就不一样了,一个类的成员函数是所有对象公用的(类似静态变量)
  2. 程序是一路向前走的,通过a.f()调用类里函数时,如果没有什么标记的话,函数是不知道谁调用的它
    为了解决这样的一个问题,我们有了this指针,this指针指向对象。函数中的成员变量实际上都是this->成员变量

this指针的数据类型

this指针是一个系统送给我们的A* const类型的指针(A为类)
如果是常成员函数的话,系统送的这个this指针会再加一个限制,变成A const* const类型
所以在常成员函数里不能调用不是const类型的成员函数(涉及到指针权限下放的问题)
这样其实也确保了const函数里不可能修改类的数据成员,做到了绝对的只读

发布了39 篇原创文章 · 获赞 4 · 访问量 5753

猜你喜欢

转载自blog.csdn.net/weixin_45725137/article/details/105242628
今日推荐