C++笔记

No.1
绪论
1.OOA==》OOD==》OOP==》OOT==》OOSM(维护)
2.原码:符号-绝对值表示;反码:正数同原码,负数符号位为1,其他各位取反;补码:负数为反码末位+1,正数不变;


No.2
数据类型,运算符,数据间转换(隐含提升,最低int),控制,循环等语句使用;


No.3
函数
1.递归;
2.引用:必须初始化,指向存在的对象,不能指向其他的对象,不开辟新的内存;
  注意与指针的使用区别(引用为别名,不能指向空,操作的是自己,指针可以指向空,非常指针还可以指向其他的内存)
3.内联函数inline(短小,不涉及循环,递归,否则开销大,类中实现的成员函数默认为内联);
4.默认形参(只能从形参表的后面,只能声明一次(并且在第一次出现声明));
5.函数重载(参数类型和个数不一致,与返回值无关,如果有默认形参,还需要注意调用造成的二义性问题,它是
  在运行前检查的);
6.系统函数(与C的兼容,例cmath),在C++中,采用extern "C“即取消重载,和C的兼容;加上explicit表示取消隐形转换;


No.4
类与对象
1.特点:抽象、封装、继承、多态(强制(转换提升)、重载(函数,运算符)、类型参数(函数模版,类模版)、包含(虚函数))
2.类与结构体的关系、区别
类(默认私有,是数据与行为的封装);
结构体(默认公有,无成员函数);无存取权限;
3.类对象占用的内存空间只是用于存放数据的,函数代码在内存中是只有一份空间(代码段)
类对象占用的内存大小还与虚函数、虚基类有关==》后续;
4.对类对象的成员访问,使用.或者指针引用;
5.成员函数在类外的实现需要加上类作用域::
6.构造函数(系统默认的无参),对对象的初始化(自动调用),可以带默认形参(需要在类中定义);
定义了构造函数会覆盖系统默认的;
7.复制构造函数(一个对象初始化另一个对象,参数为对象,返回值为对象)会调用,效率不高;使用引用不会调用,效率高;
复制构造函数本身即使用了对象的引用,没有改变其值,可以使用const)
8.析构函数(在对象生存期结束前释放内存,无参,主要用于动态分配的内存的释放)
9.类的组合(类中含有类对象)情况,对构造函数,复制构造函数的构造顺序,析构顺序相反
首先调用内嵌对象的构造函数(按照声明顺序)后执行本类;
需要在初始化列表中初始的是:内嵌类对象(无默认构造函数的),常成员数据,引用类型;
10.前向声明,但是不能定义对象,在类的内联成员函数中也不能使用该类的对象,可以定义其指针和引用;
11.UML图形标志
类,对象间关系(依赖,关联,聚合组合,泛化(继承))
12.联合体(不能继承,不支持多态)
13.对象作为参数时,临时对象的使用;


No.5
数据共享与保护
1.生存期、作用域、可见性
2.静态数据成员,在类外进行定义,所有对象共同维护,使用类名即可访问;
3.静态成员函数(可以访问静态数据和函数成员),因为未指定对象,因此不能访问非静态成员;
4.友元函数及友元类(friend)
友元函数参数是类对象的引用(不改变即可使用const),可访问私有、保护成员;
友元类;
友元不能传递,是单向的,不能继承;
5.const常对象必须初始化,不能改变,常对象只能调用常成员函数;
调用常成员函数的对象被视为常对象
6.常引用,不改变对象值,不调用复制构造函数;
7.头文件一般存放全局变量,函数声明,类声明
8.命名空间作用域,匿名的命名空间内定义的数据只能在本空间使用,使用其他空间的数据,需要
加空间作用域标志;
9.编译预处理
#include指令
#define ,#undef
#ifndef...#define...#endif等,#if...#endif;
10.define与const(主要是类型的检查,define是符号扩展,编译期执行,不占用运行时间;
11.mutable在常成员函数中使用,可以改变其修饰的值;


No.6
数组、指针、字符串
1.常数组也必须初始化;
2.对象数组(即自定义类型的数组);
3.void指针在指针所指向的数据类型不确定时使用;
4.对象指针(指向整个对象)
5.this指针(隐含于非静态的成员函数中的特殊指针,包括构造函数和析构函数)
this指针是一个指针常量,在常成员函数中,this还是一个指向常量的常指针,*this即为正在使用的对象;
6.指向类的非静态成员的指针,只需要定义时加上类名和作用域标识符(在原基础上),指向变量和函数;
同样是通过对象名或者对象指针,将成员表示为成员指针的形式(即加*);
常成员函数的指针需要为常指针;
7.指向类的静态成员的指针,用普通指针即可,但仍需指明是哪一个类的数据或者函数;
8.动态内存分配
基本数据类型内存的申请(可以初始化赋值)
对象类型内存的申请与释放(会调用默认构造函数和析构函数) 
9.动态数组,将数组封装在类中,内存的申请与释放均被封装在类中;
10.vector容器模版的使用;
11.对象的深复制(主要针对复制构造函数时,如果数据成员是指针,需要将最下层的数据一起复制过去;否则只是表面的地址复制;
12.C++的string字符串
getline()的用法输入字符串,可以指定分隔符,以换行符作为结束的标志;
13.C++中不允许动态定义数组大小;
14.二维数组名在转换时是数组的指针,而不是指针的指针;在二维指针和二维数组名使用需要注意;  


No.7
继承与派生
1.访问控制属性:public、private、protected;
公有继承:公有和保护成员属性不变,派生类内部可以访问基类公有和保护成员,
          外部通过对象可以访问基类公有成员,无法直接访问基类私有成员;
私有继承:公有和保护成员在派生类中变成私有成员,基类私有成员不可直接访问,派生类内部可以访问基类的公有和保护,
 外部不可访问;派生类继续派生,则子派生类不可访问,这是与保护继承的主要区别;
保护继承:公有和保护成员在派生类中变成保护成员,基类私有成员不可直接访问,派生类内部可以访问基类的公有和保护成员,
 外部不可访问;在派生类以保护继承时,派生类继续作为基类派生,如果是公有/保护,则下一派生类内部可以访问,
 如果是私有继承,则不能访问;
2.类型兼容原则
即用公有派生类的对象替代基类对象;主要为以下情况:
1)派生类对象可以隐含转换为基类对象;
2)派生类的对象可以初始化基类的引用;
3)派生类的指针可以隐含转换为基类的指针;
替代之后,只能使用从基类继承的成员;主要用于操作基类成员;
3.派生类的构造函数和析构函数
1)不能从基类继承构造函数和析构函数;
2)在构造函数初始化列表中完成对基类的构造以及新增成员对象的构造,使用默认构造函数则不用;
3)如果需要调用基类含形参的构造函数,则派生类必须声明构造函数;
4)如果无构造函数,系统会自动生成默认构造函数对不需参数的对象进行初始化;
5)派生类构造函数执行顺序:首先调用基类的构造函数(按继承时声明的顺序),然后对新增成员对象初始化(按照类中声明的
   顺序),最后执行派生类构造函数体内容;析构函数顺序与之相反;
4.复制构造函数,在继承时未编写时,系统会自动生成,并自动调用基类的复制构造函数;
5.作用域标识符的使用;用于限定某一作用域;避免二义性问题;
6.虚基类主要用于解决派生类的直接基类的基类继承产生的多个数据副本的问题;表示虚基类只有一个副本;
  虚基类需要在派生类中对虚基类也进行构造函数的初始化,但是构造是根据建立对象时的类进行构造的(即称为最远派生类);
  派生类的其他基类对虚基类的构造和调用都将自动忽略;
7.组合:对外接口被封装在了类中;表示一个“有的”关系;
  继承:基类的接口在派生类也存在(公有方式时);表示一个“是的”关系;


No.8
多态性
1)分为编译时的多态和运行时的多态;(确定同名操作的具体操作对象);
2)运算符重载至少有一个操作对象是自定义类型;
3)不能重载的运算符有. 、.* 、:: 、?:4个;还有sizeof();
4)两种形式:类的非静态成员函数和非成员函数; 
5)成员函数重载,左操作数必须是对象类型;
虚函数
1)基于动态绑定,必须是非静态的成员函数;
2)基类的指针访问派生类中同名的函数,将基类函数设置为虚函数;只在声明中;应该是调用基类的指针或引用;
3)不能声明虚构造函数,可以声明虚析构函数;
4)纯虚析构函数必须给出实现;
5)抽象类不能实例化,但是可以定义其指针和引用;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值