查看: 115|回复: 1

C++中的const:位置和含义

[复制链接]

6

主题

8

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2023-1-8 18:23:52 | 显示全部楼层 |阅读模式
Prelude:

尽管const作为“constant”含义的关键字已经人尽皆知,但是其在不同的位置,修饰的含义和起到的效果亦有不同。
如若梳理不当,欢迎于评论区友善指出。
纲举:

“constant”意为常量,被这个东西修饰过的函数或者变量等,可以将其理解为博物馆展品的玻璃柜被加上了一把锁——
只能看不能动,只能读不能改。
目张:

我们再来看看在语法上可以怎么实现?
修饰变量或对象:

const在修饰变量类型的时候放在左侧,两种写法是等价的:
int const a= 5;
const int a= 5;(这个等价的特点我们随后在理解指针的时候会用到)
修饰类的成员函数:

修饰函数本身的时候,和符号final和override的位置一样,放在函数的左侧,比如:
Complex operator+(Complex &c2) const;//对于复数的重载加号函数,参考郑莉第五版C++P309下面
注意:

  • 【含义上】这里const的含义是不会修改对象的数据成员,而不是修改函数本身
  • 【与常对象关系】,常对象只会调用常函数,所以有些有经验的开发者会将同一个功能(前提是不改变数据成员的值)写两个函数:普通版本,和常函数版本
  • 【与非成员函数】非成员函数不能用const修饰:
#include <bits/stdc++.h>

using namespace std;

void fun(int *p) const
{
        *p=5;
}

int main()

{
        int a=3;
        int *p;
        p =&a;
         fun(p);
       

return 0;

}比如这段代码在编译的时候会出现这样的报错:



含义是非成员函数不能有cv 限定符,cv 限定符 c++有两个:const 和 volatile,这儿指const

在修饰返回值的时候,和返回值类型的位置一样,放在左侧(且在是返回值前面):
const int& fun(int& a);
修饰指针:

缘起于这样一道题:


上机跑了下之后:
的#include <bits/stdc++.h>

using namespace std;

int main()

{
        char x='a';
        const char *p;
        p=&x;
        *p='b';
        cout << *p<<endl;
//        char y='d';
//        p=&y;
//        cout<<*p<<endl;
//        这段是测试B选项的:改变其指向看看会不会报错

return 0;

}编译之后的报错是这样的:



看来const是修饰这个字符的

但是要修饰指针的话要怎么做到呢?
直到后来在网上找到了C++创始人Bjarne的一个助记的方法:
把一个声明从右向左读
如果把声明中的*读成“指向……的指针”的话,那末:
char * const p——p是恒常(const)的指向字符型的指针【p的指向不会改】
const char * p——p是指向常字符(const char)的指针【记得我们刚刚说的等价吗?这里就是p指向的字符不会改】
其实这个助记法也把前面函数的部分统一了起来:
声明一个(const:不改变数据成员的,final:不被覆盖的,override:是虚函数的)形参为……的函数,
返回(数据类型是……的,const:不被改变的)值
先写这么多吧
回复

使用道具 举报

2

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 前天 15:06 | 显示全部楼层
看起来不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表