1.放在常量前面
const int n=4;
这n的值不能改变。
2.指针常量和常量指针
指针常量
int *const p;
常量指针
const int *p;
两个概念比较容易混淆,区分如下:
常量指针:不能通过指针修改指针所指向的变量的值,但指针可以指向别的变量。
指针常量:指针所指向的变量的值可以改变,但指针指向的地址不能改变。
总结来说就是在前面的不能改变,常量是一个值,指针是一个地址。
3.在函数的形参里
void funtion(const int m,const float s)
{
m=1;
s=1;
/*m++;
s=s+2;
m=s+3;*/以上三个操作都是错误的,因为形参被const定义,不能改变
}
4.在类的成员函数
class Student
{
public:
Student(int n,float s):
num(n),score(s) { }
void change(int n,float s)const
{
num=n; //error
score=s; //error
}
void display()const
{
cout<<num<<" "<<score<<endl;
}
private:
int num;
float score;
};
上面的类里,成员函数change和display都不能改变类的数据,即不能改变num和score的值
5.在定义类的对象时
class Student
{
public:
Student(int n,float s):
num(n),score(s) { }
void change(int n,float s)const
{
num=n;
score=s;
}
void display()const
{
cout<<num<<" "<<score<<endl;
}
private:
mutable int num;
mutable float score;
};
int main()
{
//Student stud(101,78.5);
// stud.display();
const Student stud(101,78.5);
stud.display();
stud.change(101,65.4);
stud.display();
return 0;
}
对象stud只能调用类里面的const成员函数,而const成员函数不能改变类的数据,这就保证了这些数据不会因为程序员的操作改变。
但有时候我们虽然定义了const对象,但还是像改变数据,那怎么办呢,我们这是可以有下面的两种方法:
1.
private:
mutable int num;
mutable float score;
利用mutable关键字
2.
#include <bits/stdc++.h>
using namespace std;
class Student
{
public:
Student(int n,float s):
num(n),score(s) { }
void change(int n,float s)
{
num=n;
score=s;
}
void display()
{
cout<<num<<" "<<score<<endl;
}
private:
int num;
float score;
};
int main()
{
//Student stud(101,78.5);
// stud.display();
Student stud(101,78.5);
Student *const p=&stud;
p->display();
p->change(101,80.5);
p->display();
return 0;
}
这就利用到了我们上面讲的指针常量,它可以改变指针所指变量的值。我们这时还可以发现,指针常量可以调用非const成员函数。