C/C++中的const修饰符用法总结

const的基本含义
  • 在 C/C++ 语言中,const关键字是一种修饰符。所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有 “只读” 的特点。 在编译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。

所以,const修饰符的作用主要是利用编译器帮助我们检查自己代码的正确性。我们使用const在源码中标示出“不应该改变”的地方,然后利用编译器,帮助我们检查这些地方是否真的没有被改变过。如果我们不小心去修改了这些地方,编译器就会报错,从而帮助我们纠正错误。使用const和不使用const,对于最终编译产生的代码并没有影响。
虽然const对于最终代码没有影响,但是尽可能使用const,将帮助我们避免很多错误,提高程序正确率。

在C/C++中,常见const修饰符用法

const 变量

  • const 变量指的是,此变量的值是只读的,不应该被改变。
    在定义时必须初始化
const int a = 10; //a的值不能改变

const类对象

  • const类对象指的是,此类对象不应该被改变。
const MyClass a;
  • 不能改变成员变量的值,不能调用非 const 成员函数

指向const变量的指针

  • 指向 const 变量的指针,指的是一个指针,其中保存着一个 const 变量的地址。
    由于指针指向一个 const 变量,所以通过指针,不能修改这个 const 变量的值。
const int* a;
  • 指针指向的内容不能改变,指针的指向可以改变。

  • 编译器通过指针的类型来判断指向地址的内容的类型

const 指针

  • const指针指的是,一个指针本身经过 const 修饰,自身内容(指针指向)不应该发生改变。
int* const p = NULL;
  • 指针的指向一经确定,不能改变。但是指针指向的内容,可以改变。使用时必须初始化

const指针和指向const变量的指针,在写法上容易使人混淆。给大家介绍一种我自己用着比较顺手的区分方法:从右向左,依次结合,const就近结合。

比如,int * const p 可以这样进行解读:

1、int * ( const p ):变量p 经过 const 修饰,为只读变量。

2、int (* (const p)):(const p 现在作为一个整体) 只读变量p是一个指针。

3、(int (* (const p))):(同样的 * const p 作为一个整体) 这个只读的指针p,指向一个int型变量。

于是,可以区分出 int * const p 是一个指向 int 型的const指针。

再比如,const int * p 可以这样解读:

1、const int (* p):变量p是一个指针。

2、(const int) (* p):(const与就近的 int 结合)这个指针指向 const int 型变量。

所以,const int * p 是一个指向 const 整形变量的指针。
指向const变量的const指针

  • 指针指向的内容不可变,指向也不可变
const int* const p;

const 变量作为函数参数

void func(const int a);
  • 函数内部不能改变此参数的值
  • 指向const变量的指针做参数,允许使用一般指针调用(反之不可)

const返回值

  • const 型的返回值,指的是函数的返回值为一个 const 变量。
const string& func(void);

const成员变量

  • const成员变量必须在初始化列表进行初始化
  • 静态成员变量必须在类外进行单独的初始化和定义
class solu {
	static const int b;
	const int a;
public:
	solu(int x) :  //cosnt成员初始化需要用初始化列表
		a(x)
	{

	}
};
const int solu:: b = 1; //静态const成员初始化

const成员函数

  • const成员函数指的是,此函数不应该修改任何成员变量。
    传给const成员函数的this指针,是指向 const 对象 的 const 指针。
    const成员函数,不能够修改任何成员变量,除非成员变量被 mutable 修饰符修饰。
  • 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
class solu {
	int a;
public:
	solu(int x) :  //cosnt成员初始化需要用初始化列表
		a(x)
	{}
	void func() const;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值