2019年C++再拾起

一、前言
已经将C++丢了两年时间了,出来工作后,只与C语言打交道,学的又不深,需重新学习C++远征攻略,地址:
http://www.imooc.com/course/programdetail/pid/42
以下按课程学习:
二、C++远征之起航篇
1、数据类型 与C语言相比多个bool类型;
2、C++的I/O方式
cout<<x<>x
3、命名空间nacespace
定义nacespace B结构体;使用时using nacespace B。无特殊定义下,默认调用B中函数。

三、C++远征之离港篇
1、引用:变量的别名——操作相同的
int a=3;int &b=a;//引用必须初始化
引用做函数参数别名
2、const类型
const int x=3;等价于int const x=3;
3、函数参数的有默认的初始化必须在参数表的最右端
4、函数重载
在相同作用域内,用同一函数名定义的多个函数,其中参数个数、参数类型和参数顺序不同
5、内联函数inline:编译时,将函数体的代码和实参代替函数调用语句。(内联函数是建议性的,由编译器决定;逻辑简单,调用频繁的函数建议使用内联;递归函数无法使用内联)
6、内存管理
申请内存和释放内存:new delete 释放结束后,再次赋值为空(p=NULL)

四、C++远征之封装篇(上)
1、类 对象(对象是具体的实物,类是抽象出来的概念)

class school   ——关键字   类名
{
	int tearcher;
	int studer;    ——属性     数据成员

	void read();
	void write();   ——方法     成员函数
};

把类信息封装起来,希望看到的暴露出来,不希望的隐藏起来
访问限定符:public——公共的 protected——受保护的(对于自己和继承的类,相当于public,对于其他的或无关的类,相当于private) private——私有的

2、对象实例化——栈(直接声明,系统自动回收)、堆(new申明,需手动回收)

3、string类型
s3=s1+s2;
4、面向对象的核心:通过封装思想,调用函数执行。数据成员有些不希望被其他对象调用。
5、构造函数(初始化)、析构函数(释放)
6、类内函数和内联函数
类外定义A::func(){}
7、C++中内存分区:堆区、栈区、全局区、常量区、代码区
8、对象初始化:有且只有一次;有条件初始化
9、构造函数:在实例时自动调用,有且执行一次,无返回值。(构造函数有多种重载形式;实例时执行一个构造函数;未定义时,编译器自动生成一个默认构造函数)
10、默认构造函数:在实例化过程中不需要传入参数
构造函数初始化列表 student:name(“jane”),age(11) {} (特点:先于构造函数执行;只能在构造函数中;可初始化多个成员) 类中私有的const数据成员如果需要初始化必须在构造函数中使用初始化列表。
11、拷贝构造函数student(const student &std),拷贝构造函数的参数是确定的,不能重载。有拷贝构造函数就需要显性申明构造函数。
student B(A);//=A;进入拷贝构造函数,不进入构造函数初始化
12、析构函数——对象销毁时,释放资源,回收。没有参数,不允许重载,无返回值。
13、执行顺序:对象的构造从类层次的最根处开始,在每一层中,首先调用基类的构造函数,然后调用成员对象的构造函数。析构则严格按照与构造相反的次序执行,该次序是唯一的,否则编译器将无法自动执行析构过程。成员对象初始化的次序完全不受它们在初始化表中次序的影响, 只由成员对象在类中声明的次序决定。析构与创建时相反。

四、C++远征之封装篇(下)
1、对象数组、对象成员
2、浅拷贝和深拷贝
浅拷贝:只是成员数据的简单拷贝
深拷贝:除了成员数据的简单拷贝,还将堆中内存数据也一起拷贝(主要是new申请内存情况)
3、debug assertion failed可能使用了野指针
4、对象指针,对象成员指针
5、this指针,指向当前结构,this 指当前对象的实例。对象各自的this指针指向各自对象的首地址。
Array(T *this,int len) {this->len=len;}
6、常成员函数——变量修饰为const
void changetext () const和void changetext()互为重载(重要)
调用常成员对象必须在实例化时,加const。通过实例化出来的对象调用的函数就是常成员函数。如果未加,就是调用普通的函数。
7、常指针和常引用——权限问题,是否是读写

五、C++远征之继承篇
1、不同继承访问限定:基类(父类)和派生类(子类)
公有继承:(注:父类的private无法访问)
公有继承
受保护继承:(注:父类的private无法访问)
受保护继承
私有继承:(注:父类的private无法访问)
私有继承
2、隐藏:父子关系(继承),相同成员。需调用的话,子类.父类::函数体。例如:soiler.person.attack();
3、虚析构函数:virtual ~person();ClxBase *p = new ClxDerived;大范围赋值小范围。
当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间
4、多重继承和多继承
多重继承:一个对象由多次对象继承而来
多重继承
多继承:一个对象由多个对象继承而来
多继承
多继承的构造函数:依次调用基类顺序的构造函数
5、虚继承——一个对象包含相同的类A数据(多份),造成数据冗余,系统开销

菱形继承

五、C++远征之多态篇
1、静态多态(早绑定)和动态多态
静态多态:很早的就确定需要运行哪个代码段函数,绑定进去了(早绑定),跟重载一样。
动态多态:相同的函数根据对象不同,产生不同的动作。以封装和继承为基础。只有在基类和父类形式下才能实现。
2、父类加上关键字virtual实现虚函数,子类建议也加上关键字virtual。虚构造函数为了避免使用父类指针释放子类指针对象时造成内存泄露。
3、virtual限制条件:普通函数不能使用,只能是成员函数;构造函数不能加virtual;静态static函数不能加virtual;内联函数inline不能添加virtual,使其为虚函数
4、虚函数表、虚函数表指针——一个类中只有一份虚函数表。类中第一个为虚函数指针地址。
5、覆盖和隐藏
隐藏:父类和子类有相同的函数。子类无法调用父类的函数。
覆盖:虚函数表。子类的函数覆盖父类的函数(函数地址改变)。——多态
6、类中没有数据时,也可以实例化,要用一个内存单元来标定它的存在。
7、虚基类和虚函数指针列表是不同的,占用位置不同。
8、像虚基类表指针和虚函数表指针这些类里面必要的时候会出现的“隐藏成员变量”它们的对齐规则可以总结为一句话:
隐藏成员的加入不能影响在其后的成员的对齐。
9、纯虚函数。virtual void test()=0;没有函数体,赋值为0;
10、抽象类:含有纯虚函数的类称为抽象类。抽象类不允许实例化对象。抽象类的子类也有可能是抽象类。只有实现了才能实例化。只有纯虚函数重新实现函数体后,类才能实例化对象,否则都算是纯虚类,仍为抽象类
11、接口类:只含有纯虚函数的类称为接口类(不存在成员函数和数据成员)。可以使用接口类指针指向其子类对象,并调用子类对象中实现的接口类中纯虚函数。
12、RTTI(run-time type identification)运行时类型识别。继承关系不是RTTI的充分条件,只是必要条件。
typeid(对象)——dynamic_cast <子类>
typeid限制条件:基类中存在虚函数;typeid的为type_info对象;
dynamic_cast限制条件:只能是引用或者指针;对象存在虚函数;如果运行成功,返回的为对象的地址;如果失败为NULL;

Bird p;
Plane *p = new Bird;
void dothing(Plane *p)
{
	p->planeable();
	cout<<typeid(*p).name<<endl;
	if(typeid(*p)==typeid(Bird))
	{
		Bird *bird = dynamic_cast<Bird *>(p);
		bird->froging();
	}
}	 

13、异常处理(抛出异常)
try如果有异常,抛出,捕获异常后,后续代码不执行。

一个try可能有多个catch处理
try
{
	fun1();//正常运行的
}
catch(int)
{
}
catch(double)
{
}
catch(...)//所有异常
{
}

14、常见异常错误:数组越界;除数为0;内存不足(内存泄漏)
15、使用多态方式处理异常,throw抛出异常
异常类

try
{
	fun1();
}
catch(Exception &e)
{
	e.xxx();//调用对应的异常
}

六、C++远征之模板篇
1、友元函数——友元类;静态成员与静态函数;运算符重载;模板使用
2、友元成员函数和友元全局函数,关键字:friend,跟在什么位置没什么关系,最好写在前面
friend void Print(Coor &x);
3、友元类

class A;—— 其他类
class B
{
	frined A;
public:
	void fun1();
private:
	int m;
};
class A
{
public :
	void fun2()
	{
		cout<<a.m<<endl;
	}    
private:
	A a;	
}

4、友元特点:友元关系不可传递、继承;友元单向性;友元声明的形式和数量不受限制。友元只是封装的一种补充,尽量不使用。
5、由于编译器不同,友元类有两种写法。1、friend class 类名; 2、friend 类名;推荐使用1、friend class 类名; 容易识别
6、友元成员函数时,类名和数据成员需要提前定义,然后才能实现代码
7、静态变量和静态成员函数。静态成员函数只能使用静态变量或者静态函数,不能使用普通变量和普通函数。
8、一元运算符重载:-以及++前置(&,目前的值)和++后置(对象,变化前的值)
9、二元运算符重载:+号(成员函数重载和友元运算符重载),<<输出运算符(只能用友元重载,不能使用成员函数),[]索引运算符(只能用成员函数,不能用友元)
10、函数模板,统一用一个函数名,避免重复定义。template void Dispaly(T a);
11、函数模板参数个数如果为0个,则没有必要使用函数模板
12、类模板,定义:template 每次定义成员函数都需要加上这句话。
13、模板代码不能分离编译(.h和.cpp文件),函数的声明和实现不能分离。
模板函数的代码其实并不能直接编译成二进制代码,其中要有一个“实例化”的过程。
14、STL标准模板库
vector向量:在长度时间内读取完成
iterator迭代器:
list链表:数据插入速度快
map映射:Key(键)——value
map

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值