类的过度
从C语言到C++说明,类的来源:
C语言中,结构体中只能定义变量,在C++中,结构体中可以是变量也可定义函数。
//C语言中结构体,假设定义一个栈
typedef int STDataType;
struct Stack
{
STDataType *a;
int size;
int capacity;
};
void StackPush(struct Stack *ps, STDataType x);
C++中,结构体可以定义变量也可以定义函数。
//C++中的struct 兼容C所有用法,同时将C++将其升级为类
typedef int STDataType;
struct Stack
{
void Init(int initSize = 4)
{
a = (STDataType *)malloc(sizeof(STDataType)*initSize);
size = 0;
capacity = initSize;
}
void Push(STDataType x)
{
a[size] = x;
size++;
}
STDataType *a;
int size;
int capacity;
};
在上面代码结构体定义,C++习惯将struct写成class来处理。
类的定义
一般,类可以写成下面形式:
class className//class + className(类名)
{
//类体,类体 = 成员函数+成员变量
};//注意此处的分号
对上述的一般形式进行扩展,可以得到类的两种定义方式:
-
类的定义方式1:声明和定义全部放在类体中:(注意:成员函数如果在类中定义,编译器可能会将其看成内联函数)
-
类的定义方式2:分开定义,可以将声明放在.h中,类的定义放在.cpp中。
类的访问限定符及封装
访问限定符:
- public
- protected
- private
- public修饰的成员在类外可以直接被访问,而其余两个protected和private修饰的成员在类外不能直接被访问;
- 访问权限作用域从该访问限定符的位置开始直到下一个访问限定符出现未知,或者直至类结束;
- class的默认访问权限是private,struct的默认访问权限是public(因为C++要兼容C,C中结构体是如此)。
- 访问限定符只在编译时有用,当数据映射到内存之后,没有访问限定符的区别。
封装:
封装的本质是一种管理;它将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节(程序员管理),仅对外公开接口来和对象进行交互(面向对象)。
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员,需要使用 ::作用域解释符知名成员属于那个类域。
typedef int STDataType;
class TestClass
{
public:
void print();
private:
int _name[20];
};
void TestClass::print()
{
cout << "hello test" << endl;
}
类的实例化
用类类型去创建对象的过程,称为类的实例化。
- 定义出一个类,并没有分配实际的内存空间来存储它。
- 一个类可以实例化出多个对象,实例化出的对象占实际的物理空间,存储类的成员变量。
- 类实例化出的对象才能实际存储数据,占物理空间。
类对象大小
类中存储,只保存成员变量,成员函数存放在公共代码段。
实例证明:(注意在32位系统下测试)
注意:一个类的大小,实际就是该类中成员变量大小之和(遵循内存对齐),空类的大小比较特殊,编译器给了空类一个字节来唯一标识这个类。
关于结构体内存对齐规则:请见博客:结构体内存对齐讲解。
说一些话:
今天起床,看到消息说青海地震了,有人为我如何,我还不知道呢,打开手机App看到大半夜操场全是人,太可怕了。
随后快到中午,媒体传出神农去世,我看到我是不信的,谁知,就在下午一点多,人民日报等媒体传出真实消息,我感到惋惜。
再者同时伴随袁爷爷走的还有中国肝胆外科之父。共和国一天痛失两位院士。