前言
const是一个修饰符。用来修饰不变的量。
其作用与#define相似,但是它更安全。
关于常量指针和指针常量可以点击这里
常类型是指使用类型修饰符const说明的类型,常类型的变量或对象成员的值在程序运行期间不可改变
常引用
如果在说明引用时用const修饰,则被说明的引用为常引用。如果常引用坐形参,便不会产生实参的不希望的更改。用法如下:
const 类型 & 引用名
例如:
int a=5;
const int &b=a;
其中b是一个常引用,它所引用的对象不允许被改变,如果出现让b=2,则会出错。如果一个函数使用常引用则在函数执行期间不允许改变其引用的对象。
常对象
如果在说明对象时用const修饰,则被说明的对象为常对象。常对象的数据成员在对象的整个生存期间不能发生改变。其用法如下:
类名 const 对象名 [ (参数表) ];
或者
const 类名 对象名 [ (参数表) ];
#include<iostream>
using namespace std;
class node{
public:
int x;
};
int main(){
node N;
N.x=10; //N为普通对象,可以修改其数据成员
const node M;
M.x=10;//此时会报错,因为M为常对象,其数据成员不能被直接或间接的改变
return 0;
}
常数据成员
1. 常数据成员
类的数据成员可以是常量或常引用,使用 const 说明的数据成员称为常数据成员。如果在一个类中说明了常数据成员,构造函数就只能通过成员初始化列表对该数据成员进行初始化,而其他任何函数都不能对该成员赋值
#include<iostream>
using namespace std;
class node{
private:
const int x;
const int y;
public:
node(int a,int b);
};
node::node(int a,int b):x(a),y(b){
//在构造函数体内初始化是非法的
cout << x <<' '<< y;
}
int main(){
node N;
return 0;
}
2. 常成员函数
在类中使用关键字 const 说明的成员函数为常成员函数,格式如下:
类型说明符 函数名 (参数表) const
const 是函数类型的一个组成部分,因此在声明函数和定义函数时都要有关键字 const。在调用时不必加 const。
#include<iostream>
using namespace std;
class node{
private:
int x;
int y;
public:
node(int a,int b);
void show();
void show()const;
};
node::node(int a,int b):x(a),y(b){}
//定义普通成员函数
void node::show(){
cout << x << ' ' << y << endl;
}
//定义常成员函数
void node::show()const{
cout << x << ' ' << y << endl;
}
int main(){
node N(5,10); //定义普通对象
N.show(); //调用普通成员函数show()
node const M; //定义常对象
M.show(); //调用常成员函数show()
return 0;
}
说明:
- 常成员函数可以访问常数据成员,也可以访问普通数据成员。常数据成员可以被常成员访问,也可以被普通成员函数访问。
数据成员 | 普通成员函数 | 常成员函数 |
---|---|---|
普通数据成员 | 可以访问,也可以改变值 | 可以访问,但不可改变值 |
常数据成员 | 可以访问,但不可以改变值 | 可以访问,但不可改变值 |
常对象的数据成员 | 不允许访问和改变值 | 可以访问,但不可改变值 |
- 如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数,而不能调用普通的成员函数。常成员函数是常对象唯一的对外接口,这是c++从语法机制上对常对象的保护。
- 常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数,这就保证了在常成员函数中绝对不会更新数据成员的值。