目录
一、认识面向过程与面向对象
二、类的引入
三、类的定义
1、类有两种定义方式:
1.定义与声明全部放在类体中。
2.类声明在.h文件中,成员函数定义在.cpp文件中。
2、成员变量命名规则的建议
四、类的访问限定符与封装
1.封装
2.访问限定符
五、类的实例化
我们之前学过的c语言是一种面向过程的语言,面向过程指代码关注的是过程,分析求解解决问题的步骤,通过函数调用逐步解决问题。而c++则是面向对象的语言,指关注的是对象,将一件事情拆分成不同的对象,通过不同对象之间的交互来完成。
打个比方:一个外卖系统中,面向过程关注:上架、接单、出餐、送餐等过程。而面向对象则只需关注:商家、骑手、用户三个过程,通过他们之间的交互来完成一次外卖事件。
在c语言中我们知道一种结构类型叫作结构体,能在其中定义变量。而在c++中,对结构体进行了升级,使其不仅能定义变量,还能定义函数。例如:在实现一个栈时,我们可以将栈的初始化、入栈、栈的销毁等函数都写入栈这个结构体中,比c语言要方便许多。在用c语言实现栈和队列时,每一个功能我们都需要分别写一个函数,在之后调用时也总要打出函数名来调用,非常麻烦。而在c++中,我们可以直接在结构体中找到相应的函数,直接调用,使代码更加高效。
struct stack
{
void Init(size_t capacity = 4)
{
_a = (int*)malloc(sizeof(int) * capacity);
_top = 0;
_capacity = capacity;
}
void Push(const int& data)
{
_a[_top] = data;
_top++;
}
void destroy()
{
if (_a)
{
free(_a);
_top = 0;
_a = nullptr;
}
}
int* _a;
int _top;
int _capacity;
};
而在c++中,我们又给这种升级后的结构体取名叫类,用class来代替struct。
class classname
{
//类体:包括成员函数和成员变量
//...
};//注意分号
class为定义类的关键字,classname为类的名字,{}内为类的主体,包括成员变量(又叫类的属性)和成员函数(又叫类的方法)。
这样的话需要注意的是,成员函数如果在类中定义,编译器可能会将其做内联函数处理。但最终是否成为内联函数,仍然取决于编译器。
注意:成员函数前需要加 类名:: 因为类定义了一个新的作用域,其目的是打开类域。
在一般情况中,我们尽量使用第二种。
我们首先来看下面这个代码:
class data
{
void init(int year)
{
year = year;
//这里的year到底是函数形参还是成员变量??
}
int year;
int mouth;
int day;
};
我们无法辨别成员函数中year=year中的year到底是函数形参还是成员变量,所以为了方便分辨,我们通常在成员变量前加下划线_,可改成如下:
class data
{
void init(int year)
{
_year = year;
//这里的year到底是函数形参还是成员变量??
}
int _year;
int _mouth;
int _day;
};
面向对象有三个主要特性:封装、继承、多态。我们这里先来了解封装。
c++中实现封装的方法便是访问限定符。访问限定符分为三个:public(公有)、protected(保护)、private(私有)。
其中:
1.public修饰的成员在类外可以直接访问。protected和private修饰的成员在类外不能直接访问。
2.访问限定符的有效范围从其开始的位置到下一个访问限定符出现为止,或是后面没有访问限定符,到}为止。
3.c++为了兼容c语言,struct的默认访问权限为public,而class的默认访问权限为private。
用类类型创建对象的过程,称为类的实例化。
类是对对象进行描述的,是一个模型。定义一个类时并没有分配实际的内存空间来储存它。一个类可以实际化出多个对象,实际化出的对象占用实际的物理空间,储存类成员变量。
打个比方,定义类只是一张房子的设计图纸,没有实际的房子。而实际化出的对象,就是根据这个图纸建造出的实际存在的房子。
如下代码:person只是定义了一个类,man1是类的实际化。
class person//没有开辟空间
{
public:
char* name[20];
int age;
int phone;
};
int main()
{
person man1;//开辟了空间
man1.age = 20;
//...
return 0;
}