zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【C++】const 方法

C++方法 const
2023-09-11 14:15:38 时间

1. 概述

class People {
public :
    void say(string word);
    void run(Location &loc);
    
    string &name() const;
    
    static void is_valid_height(double height);
private:
    static int total_num;
    
    string __name;
    Day __birthday;
    double __height;
    double __weight;
};

const方法是为了配合const对象使用的,普通的成员方法可以改变对象内部的属性值,const对象是一种不希望不改变的对象,如果const对象调用非const成员方法,就显得有些违和了。

const方法保证了在该方法内部不对当前对象的所有属性值进行更改,是提供给const对象使用的。

普通成员方法say()const对象qiao,通过qiao对象调用say()方法编译器报错:
image-20210303115700386
因为say方法不是const类型的方法,但是qiao对象是const对象,const对象不能调用非const方法

say 方法更改为 const 类型

#include<iostream>
using namespace std;

class People {
public:
    People() {
        People::total_num += 1;
    }

    static void say_count() {
        cout << People::total_num << endl;
    }

    void say() const {
        cout << "hahaha, funny!" << endl;
    }

    ~People() {
        People::total_num -= 1;
    }
private:
    static int total_num;
};

//类属性的定义
int People::total_num = 0;

int main() {
    const People qiao;
    qiao.say();
    return 0;
}

运行输出:hahaha, funny!

2. const 方法内部修改成员属性

统计每个对象的 say 方法被调用的次数

希望对象不是数据意义上的const,而是逻辑意义上的const,即对象的一些不太重要的属性是可以更改的。

const方法内部想要修改相关成员属性,可以在成员属性前面加上关键字mutable,该关键字就是告诉编译器当前属性不归数据意义上的const的管辖,是可以进行修改的。

#include<iostream>
using namespace std;

class People {
public:
    People() : say_cnt(0) {
        People::total_num += 1;
    }

    static void say_count() {
        cout << People::total_num << endl;
    }

    void say() const {
        cout << "hahaha, funny!" << endl;
        say_cnt += 1;
        return ;
    }

    ~People() {
        People::total_num -= 1;
    }
private:
    mutable int say_cnt;
    static int total_num;
};

//类属性的定义
int People::total_num = 0;

int main() {
    const People qiao;
    qiao.say();
    return 0;
}

3. const 方法不能调用非const 方法

const 方法不能调用非 const 方法,如果需要保留这个 non-const 方法,那么就需要对 non-const 方法进行函数重载

#include<iostream>
using namespace std;

class People {
public:
    People() : say_cnt(0) {
        People::total_num += 1;
    }

    static void say_count() {
        cout << People::total_num << endl;
    }

    void say() const {
        cout << "hahaha, funny!" << endl;
        output(); //调用的是const output
        say_cnt += 1;
        return ;
    }

    void output() {
        cout << "non-const output function" << endl;
    }

    void output() const {
        cout << "const output function" << endl;
    }

    ~People() {
        People::total_num -= 1;
    }
private:
    mutable int say_cnt;
    static int total_num;
};

//类属性的定义
int People::total_num = 0;

int main() {
    const People qiao;
    qiao.say();
    return 0;
}