学习方法-3W法
首先给大家传输一种学习知识的方法,我感觉学习任何东西都可以使用这种方法,万变不离其宗嘛。学习三部曲——3W法,也就是What,How,Why,下面是我看到的以及我的一些个人理解,详细可点击学习,思维三部曲。
- What: 当我们刚刚接触一个新事物的时候,这还处于一个认知过程,首先要问What is it?也就是搞清楚你要学习的这个东西,**它是什么?**也就是搞清楚它的定义。
- How: 所谓的“HOW”,就是搞清楚它有什么作用?我们了解了它又是怎么使用它,也就是how to do?也就是了解它的使用方法或设计目的。
- Why: 所谓的“WHY”,就是搞清楚某个东西为什么设计成这样?这样设计又有什么好处?为什么不是另外的样子?
1.函数重载
- 定义:函数名相同,参数列表不同(参数类型不同或者参数个数不同或者参数顺序不同)。函数的返回类型可以相同也可以不相同。
- 目的:是提高代码复用性。
void swap();//无参数
void swap(int a);//有参数
void swap(int a,int b);//参数个数不同
2.封装
定义:把数据和操作数据的函数绑定在一起,并支持权限控制(public,private,protected)。隐藏对象的属性和实现细节,对外提供公共访问接口。
- C++认为万事万物皆为对象,对象上有其属性和行为。(类中的属性和行为分别被称为成员变量,成员函数)
- 具有相同性质的对象,可以称之为类。人有人类,但具体对象可以是学生,工人,司机等。车有车类,但具体对象可以是红旗,长城,广汽传祺等。
- 实例化:通过一个类,创建对象的一个过程。
class People student;//People是类名,实例化一个具体对象学生student
3.构造函数和析构函数
作用:编译期自动调用,完成对象初始化和清理工作。
构造函数语法:
类名(){ //初始化操作
1.没有返回值,不用写void
2.函数名与类名相同
3.可以有参数,可以发生重载
4.创建对象时,构造函数会自动调用,且只调用一次
}
析构函数语法:~类名(){ //进行清理操作
1.没有返回值,不用写void
2.函数名与类名相同,前面加~
3.不可以有参数,不可以发生重载
4.销毁前析构函数会自动调用,且只调用一次
如有在堆区开辟内存,则需在析构函数中做释放操作
}
4.拷贝构造函数
定义:拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的参数是本类型的一个引用变量。
作用:复制对象的,在使用这个对象的实例来初始化这个对象的一个新的实例。
语法:
类名(const 类名 & 对象名){
}
例如:person(const person &p){
//将传入人身上的所有属性都拷贝到我身上
}
- 浅拷贝:由编译器提供的简单赋值拷贝操作。
- 深拷贝:在堆区重新申请空间,进行拷贝。自己构造拷贝函数,解决浅拷贝带来的堆区内存的重复释放问题,当数据成员中有指针时,必须要用深拷贝。
5.继承
定义:一个对象直接使用另一个对象的属性和方法。继承是多态的前提。
作用:提高代码复用。
基本语法语法:class 子类(派生类):继承方式 父类(基类)
- 继承方式有三种:分别是公共继承(public),保护继承(protected),私有继承(private)。无论是哪种继承,父类中的私有成员都不可以被访问。
当子类继承父类后,当创建对象时,也会调用父类的构造函数。先是调用父类构造函数再是调用子类,析构函数则相反。 - 多继承:class 子类(派生类):继承方式 父类1(基类),继承方式 父类2(基类)…
多继承可能会引发父类出现同名成员,需要加作用域来区分(父类名::)。
C++实际开发中不建议使用多继承。
6.多态
定义:可以简单地说成“一种接口,多种实现”。多态可以简单地理解为同一条函数调用语句,能调用不同的函数;或者说,对不同对象发送同一消息,使得不同对象有各自不同的行为。 多态是建立在继承和虚函数之上。
多态分为两类:
静态多态:运算符重载,函数重载属于静态多态。
动态多态:派生类和虚函数实现运行时多态。
区别:
静态多态函数地址早绑定,函数地址在编译阶段确定。
动态多态函数地址晚绑定,函数地址在运行阶段确定。
动态多态的满足条件:
1.有继承关系
2.子类重写父类中的虚函数(重写:函数返回类型, 函数名,参数列表完全相同)
动态多态使用:父类的指针或引用,指向子类对象。 (Animal *animal = new Cat;//创建在堆区,要用delete释放–delete animal)
多态的优点:
- 1.组织结构清晰。
- 2.可读性强。
- 3.易于后期开发和维护。(实际开发中执行开闭原则,即对扩展进行开放,对修改进行关闭)
7.虚函数和抽象类
定义:是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。
作用:只要定义一个基类的指针,就可以指向派生类的对象。虚函数是实现多态的基础,当我们通过基类的指针是析构子类对象时候,如果不定义成虚函数,那只调用基类的析构函数,子类的析构函数将不会被调用。如果定义为虚函数,则子类父类的析构函数都会被调用。
虚函数语法:virtual 返回值类型 函数名(参数列表){ }
纯虚函数语法:virtual 返回值类型 函数名(参数列表)= 0;
当类中有了纯虚函数,这个类便称为抽象类。
抽象类特点:
- 1.无法实例化对象。
- 2.抽象类的子类必须重写纯虚函数,不然也属于抽象类,无法实例化对象。(virtual 返回值类型 函数名(参数列表){ })
8.虚析构与纯虚析构
多态使用时,如果子类属性有开辟堆区空间,那么父类指针在释放时无法调用子类的析构函数。解决方法:将父类中析构函数改为虚析构或纯虚析构。
共同作用:
1.可以解决父类指针释放子类对象(释放不干净,会造成内存泄露)。
2.都需要具体的函数实现。
区别:拥有纯虚析构函数的类是抽象类,无法实例化对象。
虚析构语法:virtual ~类名(){ }
纯虚析构语法:virtual ~类名 ()= 0;
实现:类名::~类名(){ }
PS:第一次在CSDN上写,是个好的开始,哈哈。还有很多知识点,以后慢慢写吧。