详解const

简介: C++中提供了很多关键字赋予一些东西特殊的函数,比如const、override、final等,本文将从有类和无类两个方面详细介绍const的相关用法于注意事项。剩下的等我这几天加班加点更新吧!

1.无类:

const可以修饰指针,也可以修饰指针指向的内容,还可以修饰引用返回值形式参数等。

(1)修饰指针:int a = 10; int *const p = &a; 表示指针本身不能更改。

 (2)  修饰指针所指向的内容:int a= 10; const int *p = &a; 表示指针指向的内容即对p解引用不能被赋值。但是a本身还是能修改的。

(3)修饰引用:int a = 10; const int& b = a; 表示引用本身不能更改。但是a本身还是可以改的。

(4)修饰返回值,int a = 10; const int& get_int(){ return a;},表示返回值不能充当左值

(5)修饰形式参数:int get_a(int const&a)如果传递一个引用,且这个引用加了const修饰,表示形参不能修改进而无法修改到我实参的值,这种手法也常用于防止无意修改实参产生不可预期的后果。



2.有类:

const放在成员函数参数列表右边可以修饰this指针、也可以修饰成员变量表示我的成员变量为常数据成员,还可以修饰一个对象

(1)修饰this指针:表示指向的内容不能更改即不能修改成员变量,可以改被mutable修饰过的成员变量或者常成员函数(const放到参数列表右边修饰过的成员函数)里定义的局部变量。此时这样的函数叫做常成员函数

(2)修饰成员变量:表示数据成员不能更改。此时这样的成员变量叫常成员变量。

(3)修饰对象:表示对象不能调用非const方法。因为此时这样的方法有更改对象数据成员的风险。此时这样的对象叫常对象。


接下来我们通过一段简短的代码来加深对上述知识的理解。

#include <iostream>usingnamespacestd;
classTest{
public:
voidset_a() const    {
/*a = 20;*/// 报错,const成员函数无法修改成员变量a2=20; // 可以,mutable修饰的成员变量表示我这个变量对于我的对象来说无关紧要你可以去改它    }
voidset_b()
    {
//b = 20; // 报错,const修饰的成员变量不能修改    }
Test() =default;
~Test() =default;
private:
inta1=10;
mutableinta2=10;
constintb=10;
};
constint&get_a1(constint&b) // 修饰形式参数,b不能改,从而保证了a1不会被无意改掉{
returnb;
}
intmain(void)
{
inta1=10;
inta2=20;
int*constp1=&a1; //表示指针本身不能更改//p = &a2; // 试图更改const指针将会报错constint*p2=&a1;
//*p2 = 50; // 试图通过const*指针更改p2所指针指向的内容报错a1=50; // a1自己还是可以改的constint&b=a1;
//b = 50; // 试图通过const引用更改a1的值报错a1=50; // a1自己还是可以改的/*get_a1(a1) = 10; *///报错,const修饰过的返回值类型不能作为左值Testconsttest;
//test.set_b(); //报错,const对象无法调用非const方法,有数据修改的风险return0;
}




相关文章
|
安全 编译器 C++
对C++中const的说明
对C++中const的说明
73 0
|
3月前
|
移动开发
H5中的var、let和const
H5中的var、let和const
const
const
181 0
const int*p 与 int const *p与 int * const p与const int * const p的区别(有明显对比,超级详细,超级好记)
当只有一个const并且const在*左边时: (const int*p 与 int const *p,)*p的值不能改,但是p(地址)能改.我们可以看到第一,三张图片第五行*p下面有红线表示错误.而第二,四张没有红线的地方表示正确.所以我们可知道const int*p 与 int const *p是相同的只是书写方法不同.
75 0
C++ int const 和 const int 的区别
C++ int const 和 const int 的区别
189 0
|
存储 安全 编译器
const 的使用
const 是"constant"的缩写,意思是永恒不变的,它定义的是只读变量的关键字,或者说是定义常变量的关键字。
116 0
|
JavaScript 前端开发
一个非常常见的问题:var、let和const
在ECMAScript中,有3个关键字可以用于声明变量。分别是:var、let和const。其中,var在所有ECMAScript都是可以使用的,但是let和const需要在ECMAScript6及其以上版本才可以使用。
114 0
一个非常常见的问题:var、let和const
|
JavaScript 前端开发
let和const
let和const
100 0