最近在学习C++基础部分,看了两天书,已经看过了一遍,半知半解,回过头来重新看第二遍,深入了解一下C++的基础知识。现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲解了一些知识,后来在网上面搜了关于const的关键字的讲解,但是搜到的内容和书上面讲解的内容有着非常让人疑惑的东西,看看下面的评论,更是惨不忍睹!真是误人子弟啊!
于是萌生写这篇博文的想法。本片博文力求每个知识点都是基于实例进行。大家阅读的时候可以根据实例和结果截图进行分析,对照着书中的理论进行理解!废话少说,现在开始!
1 常变量
定义常变量的一般形式:
类名 const 对象名;(或者)
const 类名 对象名;
实例代码:
#include<iostream>
using namespace std;
int main(){
const int a = 0;
int const b = 1;
cout<<a<<"==="<<b<<endl;
return 0;
}
结果:
上面定义了两个常变量,常变量定义的时候必须进行初始化的操作,如果例子中的a或者b没有初始化,则编译错误!
再看下面这个实例:
#include<iostream>
using namespace std;
int main(){
const int a = 0;
int const b = 1;
cout<<a<<"==="<<b<<endl;
b = 2;
cout<<a<<"==="<<b<<endl;
return 0;
}
这个实例尝试修改常量b的值,但是常变量的值不允许更改,所以编译之后就会出现下面的错误:
如果大家编写程序之中遇到这样的错误,说明你对const修饰的变量重新赋值了!
const修饰的变量是非常简单的,大家看看程序既可明白它的用法。
2 常对象
下面看一个类代码以及简单的调试代码
#include<iostream>
#include<string>
using namespace std;
class Student{
public:
Student(int a,string nam){
age = a;
name = nam;
}
void display();
private:
int age;
string name;
};
void Student::display(){
cout<<"age:"<<age<<endl;
cout<<"name:"<<name<<endl;
}
int main(){
Student st1(5,"lili");
st1.display();
return 0;
}
结果:
这个代码很常规,大家一看就明白。
下面把这个代码改动一下:
#include<iostream>
#include<string>
using namespace std;
class Student{
public:
Student(int a,string nam){
age = a;
name = nam;
}
void display();
private:
int age;
string name;
};
void Student::display(){
cout<<"age:"<<age<<endl;
cout<<"name:"<<name<<endl;
}
int main(){
const Student st1(5,"lili");//增加了关键字const
st1.display();
return 0;
}
只是增加了这一个关键字const之后,编译出现错误。原因在于:常对象不能调用该对象的非const型的成员函数。代码修改如下:
#include<iostream>
#include<string>
using namespace std;
class Student{
public:
Student(int a,string nam){
age = a;
name = nam;
}
void display() const;
private:
int age;
string name;
};
void Student::display() const {
cout<<"age:"<<age<<endl;
cout<<"name:"<<name<<endl;
}
int main(){
const Student st1(5,"lili");
st1.display();
return 0;
}
分别在display函数的声明和定义处增加了const关键字之后,通过编译并且运行正常。结果和预想的一样。const修饰的函数就是常成员函数。但是常成员函数依然无法更改常对象中的数据成员的值。测试代码如下:
#include<iostream>
#include<string>
using namespace std;
class Student{
public:
Student(int a,string nam){
age = a;
age = 1;
name = nam;
}
void display() const;
private:
int age;
string name;
};
void Student::display() const{
// age = 1;
cout<<"age:"<<age<<endl;
cout<<"name:"<<name<<endl;
}
int main(){
const Student st1(5,"lili");
st1.display();
return 0;
}
运行结果:
main函数中定义了常对象,但是在常对象的构造函数中可以修改常对象的成员变量,并且运行结果如上图,表明已经修改成功。但是当把注释的那一样代码取消注释,则编译出错!说明常成员函数可以访问常对象的数据成员,但是不允许修改常对象中的数据成员的值。
如果非要修改数据成员的值,则可以把数据成员声明为mutable,实例如下:
#include<iostream>
#include<string>
using namespace std;
class Student{
public:
Student(int a,string nam){
age = a;
name = nam;
}
void display() const;
private:
mutable int age;
string name;
};
void Student::display() const{
age = 1;
cout<<"age:"<<age<<endl;
cout<<"name:"<<name<<endl;
}
int main(){
const Student st1(5,"lili");
st1.display();
return 0;
}
结果:
仅仅使用mutable修饰成员变量之后,就可以通过常成员函数修改常对象的数据成员。
小结:
类名 const 对象名[(实参列表)] 或者
const 类名 对象名[(实参列表)]
常变量 它的值在定义时必须给出,并且不可改变。
常对象,它不能调用该对象的非const型的成员函数。如果需要调用成员函数,成员函数需要使用const修饰,声明和定义的时候都要使用const修饰。成员函数可以访问成员变量,但是不可以改变,如果需要改变成员变量的值,成员变量需要使用mutable修饰。
下一篇博文:
C++中const关键字用法详解及实例和源码下载(二)
C++中const关键字用法详解及实例和源码下载(三)