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; }
路漫漫其修远兮,吾将上下而求索。