C++中const关键字用法详解及实例和源码下载(一)

最近在学习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关键字用法详解及实例和源码下载(三)

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值