濮阳网站建设价格,电商推广方法有哪些,谷歌seo快速排名软件首页,wordpress 显示字体1.类初始化
通过类对象调用函数时#xff0c;this指针会作为第一个参数
class MySharePtr {public:MySharePtr(int val) : a(val) {// a val; // 不使用初始化列表的方式}int a 10;
};// 使用初始化列表的方式#xff0c; 直接使用传入的参数进行构造
MySharePtr::MyS…1.类初始化
通过类对象调用函数时this指针会作为第一个参数
class MySharePtr {public:MySharePtr(int val) : a(val) {// a val; // 不使用初始化列表的方式}int a 10;
};// 使用初始化列表的方式 直接使用传入的参数进行构造
MySharePtr::MySharePtr(int) [base object constructor]:push rbpmov rbp, rspmov QWORD PTR [rbp-8], rdimov DWORD PTR [rbp-12], esimov rax, QWORD PTR [rbp-8]mov edx, DWORD PTR [rbp-12]mov DWORD PTR [rax], edxnoppop rbpret// 不使用初始化列表的方式 在有默认值的情况下明显是先按照默认值赋值后再使用传入的参数进行构造
MySharePtr::MySharePtr(int) [base object constructor]:push rbpmov rbp, rspmov QWORD PTR [rbp-8], rdimov DWORD PTR [rbp-12], esimov rax, QWORD PTR [rbp-8]mov DWORD PTR [rax], 10mov rax, QWORD PTR [rbp-8]mov edx, DWORD PTR [rbp-12]mov DWORD PTR [rax], edxnoppop rbpret因此对于常量成员或引用类型成员必须在初始化列表中进行初始化因为它们无法在构造函数体内赋值。
动态内存调用因为事先知道类的大小因此首先将该类大小作为第一个参数调用new函数申请空间再调用相应构造函数。
2.多重继承下的虚函数
之前看其他博客上有很多人说多重继承下虚函数表指针是依次放在类存储空间头部的。 但今天在看gcc13.2编译后的汇编代码时发现虚函数表指针在存储的布局如下所示
vptr base class1
base class1 datamember
vptr base class2
base class2 datamembervtable for Soccerr:.quad 0.quad typeinfo for Soccerr.quad Soccerr::printId().quad Soccerr::printId3().quad Soccerr::printId4().quad -16.quad typeinfo for Soccerr.quad PlayerSP::printIdSP()这种方式在类初始化时比较简单因为已经知道基类大小只需要初始化基类1偏移基类1大小初始化基类2即可。 2. 上述的.quad -16表示的是将Soccerr类转换为PlayerSP基类的偏移量。