鱼C论坛

 找回密码
 立即注册
查看: 1505|回复: 0

[技术交流] C++ const用法汇总

[复制链接]
发表于 2020-10-25 03:56:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 大神本人 于 2020-10-25 13:01 编辑

1. 修饰基本类型
const int a = 1;
int const b = 2;
这两种写法是等价的;都表示被修饰的基本类型的值是不可修改(immutable)的

a++;
b++;
报错:annot assign to variable 'b' with const-qualified type 'const int'

2. 修饰指针

int a = 1;
int b = 2;

const int *pa1 = &a; // pa1 is a pointer to const (variable)
*pa1 = 2; // this will cause a error: Read-only variable is not assignable
pa1 = &b; // fine; since pa the pointer itslef is variable, which means pa can point to different address

int const *pa2 = &a; // 同上,也是常量指针,指向的常量是不能修改的

int *const pa3 = &a; // pa2 is a constant pointer, which means the pointer itself is immutable.
*pa3 = 3; // change a to 3
pa = &b; // error, because pa (the pointer) itself is immutable...

还有一种情况,就是把两个结合起来
const int *const pa4 = &a;
这声明并初始化了一个指向常量的常指针(a constant pointer which points to a constant)

3. 修饰函数形参(parameter)

C++函数的形参,分为传值和传引用两种,其中传指针是特殊的传值操作(pass by value)

-3.1 按值传递

void foo(const var);
保证了“在foo函数内部var变量是immutable的”

-3.2 按指针传递
void foo(const int*ptr);
void foo(int const *ptr)
void foo(const *int ptr); // 没有这种写法,写出来只是为了好看
void foo(int *const ptr);

其中下面两个写法是等价的
void foo(const int *ptr);
void foo(int const *ptr);
都表示传入的指针所指向的常量是immutable的

void foo(int *const ptr);
表示这是一个常指针(constant pointer),即指针本身是一个immutable的常量

-3.3 按引用传递
void foo(const int &a);
void foo(int const &a);
不允许修改传入的参数本身(parameter is alias for argument)

4. 修饰函数返回值

类比前面,const修饰的东西就是constant的
注意结合多种情况
比如返回constant pointer还是pointer to constant

const int* foo(); // 返回一个pointer to constant,用pointer to constant 接受
用pointer to constant接受:const int *pa = foo(); //pa指向的地址表示的值是immutable的

5. 修饰类成员函数
const 修饰类成员函数,防止成员函数修改被调用对象的值(不会改变实例本身)

class Demo {
public:
        Demo(){}
        Demo(int _value): _value(value){}
        void setValue(int value);
        int getValue() const;
private:
        int _value;
};

getValue的实现

int getValue() const
{
        // this-> value ++; 这句话会报错:Cannot assign to non-static data member within const member function 'getValue'
        return this-> _value;
}

这个const只能写在类成员函数签名后面,普通函数是不行的

总结起来,C++的const可以修饰变量和函数,被const修饰后变成constant的。特别注意指针常量和常量指针的区别
指针常量:本身是一个常量,int *const ptr = nulltr; //声明一个指针常量(本身也是一个指针)
常量指针:本身是一个指针,const int *ptr = nulltr; 或者 int const *ptr = nullptr;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 14:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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