C++中const的几种用法

@著作权归作者所有:来自CSDN博客作者大胡子的艾娃的原创作品,如需转载,请注明出处,否则将追究法律责任。
如有错误的地方欢迎指正,谢谢!

一、常变量

const 数据类型 变量名 = 值;
例如:
const int i = 1;
i = 2;//错误
//const int j ;j = 1;错误

声明的同时必须初始化,虽为变量,但是不能更新其值。
又有常量性质,可以进行数组大小的确定,int a[i] = { 2 }; ,是因为const编译时,执行。
储存数据区域和定义位置(全局,函数内,类中等)有关。

二、常引用

const 数据类型 & 引用变量名 = 变量名;
例如:
int i = 1;
const int j = 2;
const int & m = i; //常量引用,引用非常量。
{
m = 3;//错误,m为常变量,不能更新。
i = 3;正确,并且i和m的值都更新为3了,即可以利用被引用的变量值的更新来釜底抽薪修改常引用的变量的值。
}
const int & m = j; //常量引用,引用常量,并且m和j的值都不可更新。
int & m = j; //错误,j 为常变量,m 为非常量引用,引用是已存在变量的别名,此时m和j不能等价。

const int & 为“常量引用”,对象可以是常量,也可以是非常量。
注意:常引用可以引用非常量、常变量。而非常量引用只能引用非常量。

三、指针常量(指向变量的常指针)

数据类型 * const 指针变量名 = 变量名;
例如:
int i = 1;
int j = 2;
int * const m = &i;
// int * const m;m = &i;错误,常指针,指针必须初始化。
m = &j;m = NULL;//都错误,指针常量指向不可被修改。

注意:指针常量(数据类型 * const)的“常”修饰的时指针,不是指向的值,所以指针为“常”,指向的值可更新(*m=2;*m=j)。

四、常量指针(常变量的指针)

const数据类型 * 指针变量名 = 变量名;
例如:
const int i = 1;
int j = 2;
const int * m = &i;
m = &j;m = NULL;//都正确,常量指针指向可被修改。

const int a[3]={1,2,3};//常数组每个元素必须初始化,并不可修改其值。
数组名作为指针时不能赋值给非常量指针。

注意1:常量指针(const数据类型 *)的“常”修饰的时变量,不是指针,即指针指向常变量,指向的值不可更新(*m=2;*m=j)。
注意2:常量指针不可以赋值给非常量指针(int * p = m;错误),但是非常量指针可以赋值给常量指针(int * q =&j;m = j;正确)。

五、指向常量的常量指针

const数据类型 * const 指针变量名 = 变量名;
例如:
const int i = 1;
int j = 2;
const int * const m = &i;

注意:指针和指向的值都被“常”所修饰,所以都不可修改。

六、const修饰函数形参

参考以上内容

例如1:
int sun ( const int a, const int b )
{
//a = 1;错误。
return a + b;
}
函数参数表中,含有两个const 形参:a,b。const的存在使得sum函数只能使用a,b的值而不能修改。

例如2:
int sun ( const int & a, const int & b )
{
//a = 1;错误。
return a + b;
}
函数参数表中,含有两个形参a和b对实参的引用,引用是对指针的封装,实参会随形参值变化而变化。const的存在使得sum函数只能使用a,b的值而不能修改,所以实参的值也不会因调用此函数而修改。

例如3:
char *strcpy(char * str1,const char * str2)
函数参数表中,由于str1是需要修改的,所以不用const修饰,而str2是传递数据进来的,并不希望进行改变,所以可以用const修饰。

七、const修饰函数返回值

修饰函数的返回值,意味着该返回值不能被修改。如果传值并返回地址,const将保证该地址上的内容不会被改变。这就意味着该函数不能作为左值使用,在这种情况下,const通常也是与引用和指针一起使用的。

八、类中的const(修饰成员数据,成员函数和类的对象)

1、修饰成员数据
有普通常变量,指针常量和常量指针,普通常变量数据成员和指针常量数据成员在C++中要在类的初始化列表中初始化,但是静态常数据成员在类外说明和初始化。

#include<iostream>
using namespace std;
class A {
private:
	const int& r;         //常引用数据成员
	const int a;          //常数据成员
	static const  int b;   //静态常数据成员
public:
	A(int i) :a(i), r(a)   //常数据成员只能通过初始化列表来获得初值
	{
		cout << "constructor!" << endl;
	};
	void display()
	{
		cout << a << "," << b << "," << r << endl;
	}
};
const int A::b = 3;         //静态常数据成员在类外说明和初始化
int main()
{
	A a1(1);
	a1.display();
	A a2(2);
	a2.display();
	return 0;
}

2、修饰成员函数
该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。

在定义与使用常成员函数时要注意:
a、const是函数类型的一个组成部分,因此在函数实现部分也要带有const关键字。
b、常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。
c、常对象只能调用它的常成员函数,而不能调用其他成员函数。这是C++语法机制上对常对象的保护,也是常对象唯一的对外接口方式。
d、const关键字可以用于参与重载函数的区分。

3、修饰类的对象
表示该对象为常量对象,在对象的生命期中其中的任何成员都不能被修改,必须在定义的时候由构造函数初始化。常对象不能访问非常成员函数,只能访问长成员函数。

猜你喜欢

转载自blog.csdn.net/qq_43148810/article/details/83218314
今日推荐