C++对象模型与常函数详解

需积分: 0 0 下载量 82 浏览量 更新于2024-08-05 收藏 608KB PDF 举报
“C++编程语言中的常量和对象模型” 在C++编程语言中,对象模型分为两个主要方面:语言支持的面向对象特性,如构造函数、析构函数、虚函数、继承和多态,以及这些特性的底层实现机制。与C语言不同,C++引入了抽象数据类型(ADT),即类,来将数据和操作数据的函数绑定在一起。在C++类中,成员数据可以是静态或非静态的,成员函数则可以是静态、非静态或虚拟的。 1. 基础知识 C++类的对象在内存中分为两部分存储:成员变量和成员函数。成员变量包括普通成员变量和静态成员变量。普通成员变量存储在对象实例的内存空间中,类似于C语言中的结构体,而静态成员变量存储在全局数据区,因为它们是所有对象共享的。成员函数则存储在代码段中,因为它们是函数指针,不随对象实例创建而复制。 例如: ```cpp class Person { private: int a = 10; // 普通成员变量 }; Person person; cout << "size=" << sizeof(person) << endl; // 4个字节(假设int占4字节) ``` 这里的`sizeof(person)`会返回类`Person`的实例大小,不包括成员函数,因为成员函数不存储在对象中。 2. 常量与常成员 C++中的`const`关键字用于创建常量,确保数据在一定范围内不被修改。这可以应用于数据成员、成员函数和对象。 - **常数据成员**:用`const`修饰的数据成员只能在初始化时赋值,且之后不可更改。它们必须在初始化列表中通过构造函数进行初始化,且每个构造函数都必须初始化常数据成员,如果有多个默认构造函数。 ```cpp class MyClass { public: const int myConst; // 常数据成员 MyClass(int value) : myConst(value) {} // 构造函数通过初始化列表初始化 }; MyClass obj1(5); // 正确 MyClass obj2; // 错误,没有显式初始化常数据成员 ``` - **常成员函数**:`const`修饰的成员函数承诺不会修改对象的状态。这有助于编译器进行类型检查,防止意外修改对象数据。 ```cpp class MyClass { public: void myFunc() const {} // 常成员函数 }; ``` - **常对象**:`const`修饰的对象表示其状态不应改变。调用常对象的常成员函数是安全的,但尝试修改常对象的非静态数据成员将导致编译错误。 ```cpp MyClass const obj3; // 常对象 obj3.myFunc(); // 可行 obj3.myNonConstFunc(); // 错误,尝试修改常对象 ``` 总结,C++的`const`关键字提供了强大的类型安全性,帮助程序员避免意外修改数据。同时,了解C++对象模型中的成员存储方式对于优化内存使用和理解代码执行过程至关重要。