- 类和对象的定义
面向对象面向对象是一种程序设计范型,同时也是程序开发的一种方法。
对象是指类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
需要明确的是:C语言是面向过程语言,而C++不是纯粹的面向对象语言,而是基于面向对象的语言,因为C++包含C语言的部分。
面向对象的三大特性:封装、继承、多态
三种访问限定符:public(公有)、protected(保护)、private(私有)
- public成员可以从类外部直接访问,private可以被派生类的函数调用,private和protected成员都不能从类外访问
- 每个限定符在类体中可使用多次,作用域是从限定符出现开始到下一限定符之前或类体结束前
- 类体中如果没有定义限定符,编译器会默认为protected(结构体默认为public)
- 类的访问限定符体现了面向对象的封装性。
类的作用域分为局部域、全局域、类域、名字空间域四种
- 每个类都有自己的作用域,类的成员(成员函数、成员变量)都在类的作用域中,成员函数内可任意访问成员变量和其他成员函数
- 对象可以通过,直接访问公有成员,指向对象的指针通过 -> 也可以直接访问对象的公有成员
- 在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域
-
类类型的声明
class 类名
{
private:
私有变量和成员函数;
public:
公有变量和函数;
};
例:
声明对象的方法有三种:先声明类类型,再定义对象;在声明类型的同时定义对象;不出现类名,直接定义对象。
-
成员函数的定义和声明
-
在类内定义成员函数
Class Student
{
private:
int age;
char sex;
public:
void display()
{
cout << "Age is:" << age << endl;
cout << "Sex is:" << sex << endl;
}
};
- 在类外定义成员函数
class Student
{
private:
int age;
char* sex;
char* name;
public:
void display();
};
void Student::display()
{
cout << age << "-" << sex << "-" << name << endl;
}
类内和类外定义有什么区别呢?
- 类内定义:在函数调用的时候编译器会当做内联函数处理,在调用点将代码展开
- 类外定义:函数调用时和普通函数一样进行栈帧的开辟和回退。
具体的在后面内联函数会详细解释。
-
类实例化对象
- 类只是模型式的,限定了类的成员,定义出一个类,但是并没有分配出实际的内存空间来存储它
- 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类的成员变量
- 类就像建筑设计图,只有设计,实例化出的对象才是建筑物,能实际存储数据,占用物理空间。
-
类对象存储模型
所以每个对象的大小为类中所有成员变量的大小之和,也遵循对齐原则。
结构体内存对齐规则:
- 第一个成员在与结构体变量偏移量为0的地址处
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
- 结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
class和C语言中的struct看起来很相似,但其实不同:
- struct Node是一个类型,在C语言中这样定义struct Node a;定义了一个结构体类型的a变量;在C++中,结构体定义对象可以写成Node a
- 空的结构体在C语言中编译通不过,会报错;在C++中可以得到大小为1,在Linux环境下大小为0;空的类(C++)大小也为1。