1. 程式人生 > 實用技巧 >C++面向物件入門(十七)常函式和常物件

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; }