C++之对象模型分析

    科技2022-07-15  130

    对象模型分析

    class是一种特殊的struct

    1、在内存中class依旧可以看成变量的集合; 2、class与struct遵循相同的内存对齐规则; 3、class中的成员变量与成员函数是分开存放的; 1)、每个对象有独立的成员函数; 2)、所有对象共享类中的成员函数

    运行时对象退化为结构体的形式

    1、所有的成员变量在内存中依次排布; 2、成员变量间可能存在内存空隙; 3、可以通过内存地址直接访问成员变量; 4、访问权限关键字在运行时失效。

    类中的成员函数是位于代码段的

    调用成员函数时对象地址作为参数隐式传递

    成员函数通过对象地址访问成员变量

    C++语法规则隐藏了对象地址的传递过程

    #include <stdio.h> #include <iostream> #include <cstring> using namespace std; class Demo { int mi; int mj; public: Demo(int i, int j) { mi = i; mj = j; } int getI() { return mi; } int getJ() { return mj; } int add(int value) { return mi + mj + value; } }; int main() { Demo d(1, 2); cout << "sizeof(d) = " << sizeof(d) << endl; cout << "d.getI() = " << d.getI() << endl; cout << "d.getJ() = " << d.getJ() << endl; cout << "d.add(3) = " << d.add(3) << endl; return 0; }

    小结

    1、C++的类对象在内存布局上与结构体相同; 2、成员变量和成员函数在内存中分开存放的; 3、访问权限关键字在运行时失效; 4、调用成员函数是对象地址作为参数隐式传递。

    实例分析:

    #include <iostream> #include <string> #include <sstream> using namespace std; class Parent { protected: int mi; int mj; public: }; class Child_A: public Parent { int mk; public: Child_A(int i, int j, int k) { mi = i; mj = j; mk = k; } void print() { cout << "mi = ;" << mi << "mj = ;" << mj << "mk = ;" << mk << endl; } }; struct Test { int mi; int mj; int mk; }; int main() { cout << "sizeof(Parent) = " << sizeof(Parent) << endl; cout << "sizeof(Child_A) = " << sizeof(Child_A) << endl; Child_A c(1, 2, 3); Test* p = reinterpret_cast<Test*>(&c); c.print(); p->mi = 10; p->mj = 20; p->mk = 30; cout << endl; c.print(); return 0; }

    C++ 多态的实现原理

    1、当类中声明虚函数时,编译器会在类中生成一个虚函数表 2、虚函数表是一个存储成员函数地址的数据结构; 3、虚函数表是由编译器自动生成与维护的; 4、virtual成员函数会被编译器放入虚函数表中的; 5、存在虚函数时,每个对象中都有一个指向虚函数表的指针

    实例分析2;

    #include <iostream> #include <string> #include <sstream> using namespace std; class Parent { protected: int mi; int mj; public: virtual void print() { cout << "mi = ;" << mi << "mj = ;" << mj << endl; } }; class Child_A: public Parent { int mk; public: Child_A(int i, int j, int k) { mi = i; mj = j; mk = k; } void print() { cout << "mi = ;" << mi << "mj = ;" << mj << "mk = ;" << mk << endl; } }; struct Test { void* p; int mi; int mj; int mk; }; int main() { cout << "sizeof(Parent) = " << sizeof(Parent) << endl; cout << "sizeof(Child_A) = " << sizeof(Child_A) << endl; Child_A c(1, 2, 3); Test* p = reinterpret_cast<Test*>(&c); c.print(); p->mi = 10; p->mj = 20; p->mk = 30; cout << endl; c.print(); return 0; }

    小结

    1、继承的本质就是父子间成员变量的叠加; 2、C++中的多态是通过虚函数表实现的; 3、虚函数表是由编译器自动生成与维护的; 4、虚函数的调用效率低于普通成员函数。
    Processed: 0.018, SQL: 8