C++面向物件入門(十七)常函式和常物件
阿新 • • 發佈:2020-08-20
常函式和常物件
常函式: 在函式引數列表後, '{'前用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; }