类对象作为类成员 📅 2026/7/1 2:21:17 关键点是类对象的成员初始化列表。成员对象的构造顺序由它们在类中的声明顺序决定#include iostream#include string// 部件类引擎class Engine {public:Engine(const std::string type) : m_type(type) {std::cout Engine m_type constructed. std::endl;}void start() {std::cout Engine m_type is starting... Vroom! std::endl;}~Engine() {std::cout Engine m_type destructed. std::endl;}private:std::string m_type;};// 部件类轮子class Wheel {public:Wheel(int id) : m_id(id) {std::cout Wheel m_id constructed. std::endl;}void rotate() {std::cout Wheel m_id is rotating. std::endl;}~Wheel() {std::cout Wheel m_id destructed. std::endl;}private:int m_id;};// 组合类汽车class Car {public:Car(const std::string engineType)// 关键点成员初始化列表: m_engine(engineType), // 调用 Engine 的构造函数m_wheel1(1), // 调用 Wheel 的构造函数m_wheel2(2),m_wheel3(3),m_wheel4(4) {std::cout Car constructed. std::endl;}void drive() {std::cout Car is about to drive. std::endl;m_engine.start();m_wheel1.rotate();m_wheel2.rotate();m_wheel3.rotate();m_wheel4.rotate();}~Car() {std::cout Car destructed. std::endl;}private:// Car 对象“拥有”这些对象Engine m_engine;Wheel m_wheel1;Wheel m_wheel2;Wheel m_wheel3;Wheel m_wheel4;};int main() {std::cout --- Creating a Car --- std::endl;Car myCar(V8);std::cout \n--- Driving the Car --- std::endl;myCar.drive();std::cout \n--- Destroying the Car --- std::endl;// myCar 离开作用域析构函数被自动调用return 0;}2.1.6 静态成员所有创建的对象都会自动拥有类定义中的静态成员变量// 构造函数BankAccount(const std::string name, double initialBalance): m_ownerName(name), m_balance(initialBalance) {// 每次创建新账户总账户数和总存款额都增加s_totalAccounts;s_totalBalance initialBalance;std::cout Account for m_ownerName created. Balance: m_balance std::endl;}private:// 普通成员变量每个对象都有一份自己的拷贝std::string m_ownerName;double m_balance;// 静态成员变量所有对象共享同一份static int s_totalAccounts;static double s_totalBalance;};2.1.7 存储模型类的成员变量和成员函数分开存储的核心思想是数据与行为的分离。以一段代码为例图解面向对象的内存模型。类成员函数存放在.text区域非静态成员变量放在栈区静态成员变量放在静态数据区。#include iostreamclass MyClass {public:// 1. 非静态成员变量int mA;int mB;// 2. 静态成员变量static int mC; // 声明不占用对象内存// 3. 非静态成员函数void show() {std::cout mA: mA , mB: mB std::endl;}// 4. 静态成员函数static void staticShow() {std::cout Static member mC: mC std::endl;}};// 静态成员变量的定义分配内存int MyClass::mC 100;int main() {std::cout Size of MyClass: sizeof(MyClass) bytes std::endl; // 输出多少MyClass obj1;MyClass obj2;obj1.mA 10;obj1.mB 20;obj2.mA 30;obj2.mB 40;obj1.show(); // 输出 mA: 10, mB: 20obj2.show(); // 输出 mA: 30, mB: 40MyClass::staticShow(); // 输出 Static member mC: 100return 0;}/*****************************************************************************---------------------------| 代码区 || ----------------------- || | void MyClass::show() | | -- 所有对象共享| ----------------------- || | void MyClass::stati.. | | -- 所有对象共享| ----------------------- |------------------------------------------------------| 静态数据区 || ----------------------- || | MyClass::mC (100) | | -- 全局唯一| ----------------------- |------------------------------------------------------| 栈区 || ----------------------- || | obj1 | || | mA: 10 | || | mB: 20 | || ----------------------- || | obj2 | || | mA: 30 | || | mB: 40 | || ----------------------- |---------------------------*************************************************************************************/特性成员变量成员函数存储位置非静态: 存储在对象内部 (栈/堆)静态: 存储在静态数据区所有函数: 存储在代码区拷贝数量非静态: 每个对象一份静态: 整个类一份所有函数: 整个类一份所有对象共享与对象关系非静态: 定义了对象的“状态”静态: 定义了类的“全局状态”定义了对象的“行为”或“操作逻辑”访问机制直接通过对象地址访问非静态: 通过this指针隐式访问对象成员静态: 无this指针不能访问非静态成员对sizeof的影响非静态: 直接决定对象大小静态: 无影响所有函数: 无影响