1. const 修饰普通类型的变量
const int i = 2; // i被定义为常量
2. const 修饰指针变量
常量指针:也就是指针指向的变量为常量,指针指向的地址可以变,但指针指向的地址里的内容不能改变。
指针常量:指针是常量、也就是指针指向的地址不能变,但指针指向的地址里的内容可以改变。
const 修饰指针指向的内容,则内容为不可变量。
int i = 5;
const int* p = &i; // 不能通过指针p修改i的值
const 修饰指针,则指针为不可变量。
int i = 5;
int* const p = &i; // p被初始化为指向i,且不能更改p的指向
const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
int i = 5;
const int* const p = &i; // p被初始化为指向i,且不能通过p更改i的值,也不能变更p的指向
3. const修饰参数传递和函数返回值
值传递
因函会自动产生临时变量复制实参值,所以使用const修饰没有意义。
地址传递
自定义类型的参数传递,需要临时对象复制参数,对于临时对象的构造,需要调用构造函数,比较浪费时间,因此我们采取 const 外加引用传递的方法
// 防止指针被意外篡改
void Test(int* const p);
// 由于系统需要创建临时对象复制参数,则不可避免的调用复制构造函数,会浪费时间
void Test(ClassName object)
// 参数使用引用系统直接使用原始数据,不再重新创建副本,故效率高。
// 使用const修饰参数,指明不能修改object对象的属性
void Test(const ClassName & object)
4. const 修饰函数的返回值
const 修饰自定义类型的作为返回值
此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。
const student duplicate(const student& s)
{
student* ss = new student(s.getID() + 10);
return *ss;
}
const student& sr = duplicate(tom);
const 修饰返回的指针或者引用
const student& duplicate(const student& s);
const student duplicate(const student& s);
上述两条声明中,返回自定义类型或自定义类型的引用没有太大的区别,得到的都是一个引用,只不过返回值是自定义对象的得到时系统自动创建的匿名对象的引用。【此处说的可能不太准确,欢迎指正】
5. const修饰类成员函数
const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值。
注意:const 关键字不能与 static 关键字同时使用,静态成员函数不含有 this 指针,即不能实例化,const 成员函数必须具体到某一实例。
#include<iostream>
using namespace std;
class student
{
private:
int id;
public:
student()
{
id = 0;
}
student(int i)
{
id = i;
}
student(const student& s)
{
id = s.id;
cout << "copy constructor is called" << endl;;
}
/**
* 由于getID没有显式形参,所以为了说明此函数不能更改它所接收到的参数的值,
* 把const修饰词放在函数尾部
*/
int getID() const
{
return id;
}
void setID(int idNumber)
{
id = idNumber;
}
};
void printStudent(const student& s)
{
cout << "Student id:" << s.getID() << endl;
}
void update(student& s)
{
s.setID(s.getID() + 1);
}
int main(void)
{
student tom(1);
update(tom);
printStudent(tom);
return 0;
}
参考资料: