// 面向过程:一个一个的 函数 函数与函数之间的关系
// 面向对象:搭建场景, 往场景内部放物体(对象) 场景之中对象与对象的交互
// 特点: 抽象、封装、继承、多态
// 封装:1、将客观事物抽象成特定的类,2、对外提供一定的访问控制 ---> 信息隐藏、数
据安全
// 1、将一个客观事物抽象成类
// 1、有哪些特性(属性) -----> 变量
// 2、能做哪些事情(方法) -----> 函数
// 2、访问控制:
// 1、public 公有权限 : 允许对象在类的 内部 和 外部都使用
// 2、private 私有权限 : 允许对象在类的 内部使用, 外部不允许使用
(如果没有特别指明一个成员的权限,则默认是私有的)
// 3、protected 保护权限 : 允许对象在类的 内部使用, 外部不允许使用
// 继承:代码复用
// 多态:功能扩展
//构造函数:创建对象时自动调用
//1.函数名=类名 Test(int a, int b)
//2.没有返回值
//3.可以承载
//析构函数:销毁对象时自动调用
//1、函数名=~类名 ~Test(int a, int b)
//2、没有返回值
//3、没有参数
//拷贝构造函数: 用一个对象对另一个对象进行初始化
//1, 类名(const 类名& XX) Test(const Test &obj)
//2, 如果创建一个新的对象 则必定要调用 某个构造函数
//3, 如果某个构造函数被调用 必定意味着产生了一个新的对象
//浅拷贝:系统自动添加------值的复制,没有堆复制
//深拷贝:自己写------------堆复制
//若将拷贝构造函数设为私有函数,只需声明
//若类中有指针成员,只需手动写拷贝构造
//注意:
// 1、如果 类中一个构造函数都没有, 系统会默认添加一个无参构造函数 ==> 什么都不做
// 2、如果 类中没有析构函数, 系统会默认添加一个析构函数 ==> 什么都不做
// 3、如果 类中没有拷贝构造函数, 系统会默认添加一个拷贝构造函数 ==>简单数据类型复
制
// 对象的动态创建
// C 中: malloc 和 free ===> 库函数 不是语法的一部分
// C++中: new 和 delete ===> 运算符 是语法的一部分
// 创建单个变量 int a
// new : 类型 *变量名 = new 类型(初始值)----int *pb = new int;
//释放:------ delete pb;
// 创建一维数组 int a[10]
// new : 类型 *变量名 = new 类型[数组大小] 创建数组的时候不能进行初始化--- int
*pc = new int[10];
// 释放:delete 释放数组的时候要加 [], 不然会造成内存泄漏---- delete[] pc;
// 创建多维数组 int a[4][5]
// new 创建对象的时候会自动调用构造函数----- int (*pc)[5] = new int[4][5];
// delete 释放对象的时候会自动调用析构函数----- delete[] pc;
//普通成员变量 :-------存在栈
//静态成员变量 :static ------存在全局数据区
//1、不是对象,是类的属性,是所有对象共享的属性
//2、静态成员变量必须在类的外部初始化
//3、静态成员 可以通过类名直接使用
//普通成员函数 :1、有this指针,指向当前调用对象------存在代码段
//静态成员函数 :1、没有this 指针2、只能使用静态成员,不能使用类的普通成员-----存在代码段
//友元函数:如果一个函数是某个类的友元函数,则该函数中可以通过对象使用类的私有成员
//友元声明:在类中friend+ 函数声明
//1、友元函数不是类的成员函数,是外部函数----friend void show(Test &t);
//2、友元声明不受访问控制限制,可以在类中任意位置声明
//3、友元破坏了类的封装,尽可能不要用
//友元类:如果有一个类A,是另一个类b的友元类,则A 中所有函数都是B的友元函数
//运算符重载(自定义),编译器不知道,需要后来定义出来的规则 。运算时,编译器调函数
//函数原型:
//1、函数名:operator+运算符 -----> operator+()
//2.参数:操作数从左往右填 -----> operator+(Complex c1,Complex c2)
//3.返回值:根据需要确定 ----> Complex operator+(Complex c1,Complex c2);
Student& operator =(const Student &s)
{
//判断是否对自己进行赋值
if (this != &s)
{
// 1、调用拷贝够早函数创建一个临时对象
Student tmp = s;
// 2、将当前指针空间和临时对象的指针空间进行交换
char *p = tmp.name;
tmp.name = name;
name = p;
// 3、复制剩余内容
id = s.id;
}
return *this;
}