类:
class默认私有,struct默认公有
面向对象的三大特性:
封装、继承、多态
封装:本质是一种管控;C++数据和方法都放在类里面,使用访问限定符对成员限制
类的存储:
每个对象只存成员变量,在一个公共区域,也就是代码段存成员函数。所以不同对象的成员函数地址一样,成员变量地址不一样
类要是没有成员变量,大小是1字节,1byte,用来占位,标识对象实例化时,定义出来存在过
结构体内存对齐规则:
1. 第一个成员在与结构体偏移量为0的地址处
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值
VS中默认的对齐数为8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
指定对齐数:
#pragma pack(1)
成员函数的定义:
对象的定义:
this指针:
f2( )不在p2所指的地方
this指针的本质是Data* const this,即指针不能修改,但是指向的内容可以修改
this 存在哪里
a、堆 b、栈 c、静态区 d、常量区 e、对象里面
malloc在堆上,局部变量在栈上,static和全局的变量再常量区,存的字符在常量区
b:因为它是一个形参,局部变量,函数结束栈帧销毁(有些编译比如vs可能会用寄存器存储)
1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:void PrintA(){cout << this << endl;//this指针是空指针cout << _a << endl;//B;a存在在指针指向的空间里对空指针进行解引用,就会出错cout << "Print()" << endl;//C;没有对空指针解引用,因为Print函数不在对象里}
private:int _a;
};int main()
{A* p = nullptr;p->PrintA();//this只是作为指针传过去,并没有发生访问(*p).PrintA();//两个表达效果一样return 0;
}
对象的初始化:
构造函数:
C++里有两种类型:
内置类型 / 基本类型: int / char / double / 指针,语言自己定义的类型
自定义类型:struct / class
默认生成的构造函数,对于内置类型不做处理,自定义类型回去调用自己的默认构造
但是 C++11支持给内置类型缺省值,不是定义,只是声明
默认构造函数:
无参构造函数(函数体内给值,但是无参数)
全缺省构造函数(参数处给了初值)
我们没写编译器默认生成的构造函数(不初始化)
这里报错是因为,如果写了构造函数,编译器就不会自己生成默认的了,但是此处构造函数又需要传参
修改方法是:提供一个无参的,或者提供一个全缺省的,二选一,如果都写会混淆。
构造函数的重载:
无参构造函数创建对象时不能带括号
举例:
带默认参数的构造函数:
注意:
成员初始化列表:
引用和const修饰的数据成员只能这样初始化:
析构函数:
类似于destroy和free,防止内存泄漏
例如栈队列二叉树,在堆上还开了一部分空间没有被释放,c语言是在结尾调用destroy