C++面向对象入门(十七)常函数和常对象

常函数和常对象
常函数: 在函数参数列表后, '{'前用const关键字修饰的函数, 该函数不能修改成员属性, 除非该成员属性被mutable关键字所修饰
语法:
返回值类型 函数名(参数列表) const {
函数体
}
mutable adj.易变的;性情不定的;
mutable关键字: 用于定义成员变量时修饰成员变量, 使得该成员变量能够被常函数和常对象修改
语法 mutable 数据类型 成员变量名;
常对象: 在定义对象前使用const关键字修饰的对象, 该对象的成员属性不能被修改, 该对象也只能调用常函数以防止通过成员函数修改成员属性
语法:
const 类名 对象名;
注意事项: 常函数和常对象都能修改静态成员属性
viable adj.可行的;能养活的;能生育的;

示例代码:
#include <iostream>
#include <string>

using namespace std;

/**
 * 常函数和常对象
 * 常函数: 在函数参数列表后, '{'前用const关键字修饰的函数, 该函数不能修改成员属性, 除非该成员属性被mutable关键字所修饰
 * 语法:
 * 返回值类型 函数名(参数列表) const {
 * 函数体
 * }
 * mutable adj.易变的;性情不定的;
 * mutable关键字: 用于定义成员变量时修饰成员变量, 使得该成员变量能够被常函数和常对象修改
 * 语法 mutable 数据类型 成员变量名;
 * 常对象: 在定义对象前使用const关键字修饰的对象, 该对象的成员属性不能被修改, 该对象也只能调用常函数以防止通过成员函数修改成员属性
 * 语法:
 * const 类名 对象名;
 * 注意事项: 常函数和常对象都能修改静态成员属性
 * viable adj.可行的;能养活的;能生育的;
 */
class Rider {
public:
    static string manufacturer;

    Rider() {

    }

    Rider(const string &name, const string &model, const string &driver) : name(name), model(model), driver(driver) {
    }

    ~Rider() {
        cout << model << " UntransForm" << endl;
    }

    Rider(const Rider &rider) {
        cout << "Copy Rider, and Model is " << rider.model << endl;
    }

    Rider &changeModel(const string &model) {
        this->model = model;
        return *this;
    }

    void showModel() const {
        if(this == NULL) {
            return;
        }
        //尝试在常函数中修改成员属性
//        this->name = "零一";
        //error: Cannot assign to non-static data member within const member function 'showModel'
        this->driver = "飞电或人";
        cout << model << endl;
    }

    void showManufacturer() {
        cout << manufacturer << endl;
    }

private:
    string name;
    string model;
    mutable string driver;
};

string Rider::manufacturer = "Toei Tokyo";

void test1() {
    //定义常函数
   const Rider zeroOne = {"Zero-One","Rising Hopper","Hiden Aruto"};
   //常对象调用常函数
   zeroOne.showModel();
   //常对象能够修改静态成员属性的值
    zeroOne.manufacturer = "东映";
    cout << zeroOne.manufacturer << endl;
    //尝试使用常对象调用非常函数
//    zeroOne.showManufacturer();
    //error: 'this' argument to memeber function 'showManufacturer' has type 'const Rider', but function is not marked const
}

int main() {
    test1();
    system("pause");

    return 0;
}

 

 
posted @ 2020-08-20 12:24  DNoSay  阅读(472)  评论(0编辑  收藏  举报