const修饰基本数据类型
#include <iostream>
using namespace std; void main(){
const int a = 1;
const char b = 'k';
const float c = 3.14f;
//a = 2;
//b = 'n';
//c = 1.2f;
}
const修饰基本类型表示这些类型为常量,不能再修改或赋值。还有需要注意的是3.14默认为double类型,如果用float变量保存的话应该写成float c = 3.14f。
const修饰指针
#include <iostream>
using namespace std; void main(){
int a = 0;
int b = 0;
int c = 0;
int d = 0;
const int *p1 =&a; //指向整形常量的可变指针
int const * p2 =&b; //指向整形常量的可变指针
int * const p3 =&c; //指向可变整形的常指针
const int * const p4 =&d; //指向整形常量的常指针
}
p1所指向的内容为整型常量,所以*p1=2;是错误的。但可以进行p1++这样的操作,也可改变p1的指向
p2跟p1一样只是表现形式不同,同样的*p2=2;是错误的。但可以进行p2++这样的操作,也可改变p2的指向
p3是常指针,p3本身不能变化,不能改变p3的指向,但它所指向的内容可变,*p3=2;是对的
p4是常指针,而且指向的内容是常量,*p4=2;是错的。
判断方法:const在*前说明是指向常量的指针,const在*之后说明指针为常指针。*前后都有const说明指针为指向常量的常指针。
const修饰引用
很多同学跟我一样爱钻牛角尖将const修饰引用与const修饰指针进行对比,是不是const修饰引用也有修饰指针时的四种情况呢?
#include <iostream>
using namespace std; void main(){
int a1 = 1;
int a2 = 1;
int a3 = 1;
int a4 = 1;
const int & b1 = a1;
int const & b2 = a2;
int & const b3 = a3; //提示“qualifiers on reference are ignored”
const int & const b4 = a4; //提示“qualifiers on reference are ignored”
}
const int & b1 = a1; 则b1是常量b1++、b1=2都是不可以的,虽然b1是a1的一个别名,但是不能通过b1来修改a1。但是a1不是常量,可以a1=2,b1的值也会跟着改变。
int const & b2 = a2;与第一个是相同的,b2是引用常量,不能通过b2修改a2,但是a2不是常量,可以修改,b2随之改变。
int & const b3 = a3;提示了“qualifiers on reference are ignored”,即对引用的限定符被忽略,所以相当于int & b3 = a3; const没有起作用。
const int & const b4 = a4; 同理实质上与第一种是一样的,相当于const int & b4 = a4;
总结:首先要知道定义引用时就要进行初始化,而且引用不能改变指向。
然后const在&之前表明引用为常引用,不能通过该引用修改值。const在&之后,const不起效果。
const修饰对象
#include <iostream>
using namespace std; class A {
private:
int i;
public:
A(){ i = 0; }
void set(int n){
i = n;
}
void get() const {
cout<<"成员变量的值:"<<i<<endl;
}
};
void main(){
const A a;
//a.set(1);
//a.get();
}
定义一个const对象,const对象企图调用set函数改变成员变量的值,这是不允许的。const对象顾名思义为常对象,所有对象的成员变量不可变。而且const对象也不能调用非const函数,哪怕set函数没有修改成员变量,编译也会出错。而get函数为const函数,所以const对象可以调用get函数。