C++ 与const相关的要点整理

1.const与变量(基本数据类型变量)

在C++中,被const关键字修饰的变量,其值在程序运行时不可改变,我们称之为即常量。被const关键字修饰的变量和普通变量一样,拥有他自己的储存空间。

定义const变量的格式为:

//const 数据类型 变量名 = 常量值; 
const int i = 100;

或者交换const与数据类型的位置也是可以的:

int const i = 100;

 需要注意的地方:

1.定义const变量的同时要对它进行初始化,即给它赋值,不可先定义空的const变量然后在后面的代码中赋值

2.const变量的作用域和普通变量一致,即只在所在的代码块存活,离开所在代码块会被释放

3.const变量作为类的成员变量时,除定义时可对其初始化之外,还可在构造函数的初始化表达式中对其进行初始化,但不可以在构造函数体内初始化

2.const与指针

const指针具有const普通变量一样的特性,例如运行时不可改变值,定义时必须初始化等等。但根据指针声明时const关键字所在的位置不同,该指针的特点也不同,我们以 const与  “ * ” 符号的位置来区分。

1.在“*”前加const的常指针:

定义格式:

int a = 0;
const int* i = &a;

 根据上文提到的,将const与int的位置交换也是可以的,这也是为何我强调用 “*”与const的位置来区分不同的常指针的原因:

int const* i = &a;

在“*”号前加const关键字的指针意为禁止通过指针间接修改变量的指针,即可以用其他变量的地址对指针赋值,但是不可通过指针修改它所指变量的值,例如:

int a = 10,b = 20;
const int* p = &a; //定义时用变量a的地址对其进行初始化
p = &b; //正确, 这种const指针可以指向不同的变量
b = 50; //正确,禁止通过这种const指针间接修改变量的值不代表变量不可修改
*p = 50; //错误,不可通过这种const指针间接改变其指向变量的值
cout << *p << endl; //正确,可以访问间接变量的值但不可以修改

需要注意的是,这种指针可以先定义,后赋值,不像const普通变量一样必须定义时赋值:

int a = 10;
const int* p;//定义时可以不赋值(初始化)
p = &a;//允许在定义后再进行赋值(初始化)

2.在“*”后加const:

这种方式定义的指针意为恒指向某个变量的指针,即该指针指向的变量不可变,只能一直指向一个变量,定义格式:

int a = 10,b = 20;
int* const p = &a;//定义时必须对其初始化(赋值)

这种指针在初始化后便不可改变其指向的变量,但是可以通过该指针间接修改变量的值:

int a = 10,b = 20;
int* const p = &a;//定义时必须对其初始化(赋值) 
p = &b;//错误,不可改变其指向的变量 
*p = 50;//正确,可以通过该指针间接修改变量的值 

3. 在“*”前后都加const

这种方式声明的指针具有上面两种声明方式的特点,即既恒指向同一个变量,又不可通过该指针间接修改变量的值,例如:

int a = 10,b = 20;
const int* const p = &a;
*a = 50;//错误 
p = &b;//错误 

3.const成员函数

在C++的类中,可以通过const声明常成员函数,常成员函数不可修改类中的成员变量,只可以读取,定义格式如下成员函数fun():

class A{
    public:
	void fun() const{
	    cout << "A::fun()" << endl;
	}
	
};

成员函数可以通过是否为const函数来进行重载,例如:

class A{
	
	public:
		void fun() const{
			cout << "A::fun() const" << endl;
		}
		
		void fun(){
			cout << "A::fun()" << endl;
		}
	
};

使用const进行重载的函数在调用时根据对象的不同调用不同的对象,以上面的类A为例:对于一般的对象,调用fun()时会调用非const的函数,对于const 对象,调用fun()时会默认调用const的fun()函数,下面贴出完整代码以供测试:

#include <iostream> 

using namespace std;

class A{
	
	public:
		void fun() const{
			cout << "A::fun() const" << endl;
		}
		
		void fun(){
			cout << "A::fun()" << endl;
		}
	
};

int main()  
{  
	A a;
	a.fun();
	
	const A b;
	b.fun();
	
    return 0;  
}  

使用Dev C++运行该程序,输出:

A::fun()
A::fun() const

如此便验证了我上文所说的调用规则。

对于const成员函数还需注意以下几点:

1.常成员函数在声明和定义时都要加上const关键字,否则编译报错:

class A{
	
	public:
		void fun() const;
	
};
void A::fun() const{
		cout << "A::fun() const" << endl;
	}

2.常成员函数中只能调用常成员函数,不可以调用非const成员函数,因为非const成员函数可能修改成员变量的值 ,其次,const对象只能调用const成员函数

 

本文到此结束。

参考资料:

王慧 王浩等编著.《零基础学C++》.第三版.机械工业出版社

王珊珊 臧洌 张志航等编著.《C++程序设计教程》.第三版.机械工业出版社

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章