C++类和对象的概念
面向对象程序设计
概念:(Object Oriented Programming,缩写:OOP)是一种程序开发的方法。 对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性
在c语言中使用struct可以对数据进行抽象封装,在c++中用class封装程序和数据,其访问权限体现了封装性。
封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互
struct 和 class 的区别?
- struct不能存放函数,class可以存放成员函数
- struct默认的变量和函数都是public,也就是不限制权限,可在结构外任意访问,而class默认private
- class里的变量可以先使用可以在定义之前
c++有四个作用域
局部,全局,类域和命名空间。其中类的作用域很关键。
类的成员在类的作用域内,可以任意互相访问。对象可以通过 . 运算符访问共有成员,对象指针用 ->。在类外定义成员,用 ::指明成员函数所属类域。
类和对象的区别?
类就像是一张图纸,限定了类的成员,并未分配实际内存来存储,也像是一种自定义数据类型和操作的封装集合。
用类实例化的对象都拥有自己的物理空间来存储其成员变量。
类对象的存储模型
class Person {
public :
void Display ()
{ }
public :
char _name[20]; // 名字
char _sex[3]; // 性别
int _age; // 年龄
};
sizeof(Person) //值为28
上面的代码说明两点
- 类和结构体一样,存在内存对齐问题
- 函数不在类体内存储,也不存函数指针
函数在公共代码区存放,因为所有对象的数据不同但是方法是相同的,因此不必存储多份。
数据和方法分开存放,方法怎么和调用它的对象联系起来?
答案是在函数参数里增加一个对象指针,this指针诞生了。
this指针特性:
- 是 类对象 * const 类型
- 是类成员函数的第一个默认参数,不能显式传递
- this指针不在类对象内存储,且作用域在成员函数内
- 只能在非静态成员函数内使用
什么是 _thiscall ?
是一种函数调用约定,特指参数个数确定的类成员函数的调用,this指针的值通过ecx寄存器赋值。
参数个数可变的函数通过压栈参数的方式(_cdecl)。
offsetof宏
define offsetof(s,m) (size_t)&(((s *)0)->m)
作用:求出结构体中某成员相对结构体的偏移位置
解析:首先把0强转为结构体指针类型,用结构体指针获取其成员变量m,&取成员变量地址,最后强转为int型,值就是成员相对结构体的偏移。
其实就是利用编译器帮我们求取成员m的相对地址。