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++程序设计教程》.第三版.机械工业出版社