C++中常函数

常对象

格式:const 类 对象;

性质:

1.常对象里面的成员变量的值不能修改

2.常对象只能调用常函数

3.非常对象优先调用非常函数,若无非常函数,再调用常函数

常函数

格式:在成员函数的后面加上一个const

void get_nums() const {
        this->a = 2;
}

性质:

1.常函数只能再类中定义,出了类定义是错误的

C++中常函数_第1张图片

2.常函数中不能修改成员变量的值,也不能调用非常函数

3.如果有俩个函数,它的函数名和参数均相同,什么情况下会发生函数重载?

在这俩个函数一个是常函数,一个是非常函数的时候会发生函数重载,因为编译器会根据对象是否是常对象,来调用不同的函数。

4.成员变量在声明的时候前面加mutable,可以在常函数中修改其值

#include 
​
using namespace std;
class Person {
    mutable int a;
    char b;
public:
    Person() {
        cout << "构造函数" << endl;
    }
    ~Person() {
        cout << "析构函数" << endl;
    }
    void get_nums() {
        this->a = 2;
    }
    void get_nums() const {
        this->a = 2;
    }
    void get_nums2() {//非常函数
        //this指针是一个指针常量-->Type* const this(指向不能改变,但是可以修改里面的内容)
        a = 2;
    }
    void get_nums2cst() const {//常函数
        //this指针是一个常量指针常量-->const Type* const this (指针的指向和指向对象里面的内容都不可以改变)
        a = 2;//常函数,不能修改成员变量的值
    }
};
void show() const {//常函数只能再类中定义
//错误!
}
int main() {
    Person p1;//非常对象
    const Person p2;//常对象-->对象里面的成员变量的值不可以修改
    p1.get_nums2();//非常对象调用非常函数
    p1.get_nums2cst();//非常对象调用常函数
    p2.get_nums2cst();//常对象调用常函数
    p2.get_nums2();//常对象不可以调用非常函数
    /*
    * 总结:常对象只能调用常函数,非常对象优先调用非常函数,没有非常函数再调用常函数
    */
    p1.get_nums();
    p2.get_nums();//函数的重载,编译器可以通过调用对象的不同来区分调用常函数还是非常函数
    return 0;
​

常函数与非常函数中this指针的区别

在非常函数中:this指针是一个指针常量,指向不可以改变

在常函数中:this指针是一个常量指针常量,指向和指向里面的内容均不可以改变,这也就是为什么常函数里面不可以修改成员的是属性。

你可能感兴趣的:(c++,算法,开发语言)