1.结构体与类的区别
结构体的成员默认是公有的,类的成员默认是私有的。
2.构造函数
只有在以下三种情况,才会提供默认的构造函数。
1. 如果类的虚拟成员函数或者虚拟继承父类时;
2. 如果类的基类有构造函数;
3. 在类中的所有非静态的对像数据成员,它们所属的类中有构造函数。
3.类成员变量
在类中定义成员变量时,不能直接给成员变量赋初值。
4.重载构成条件
函数的参数类型,参数个数不同。
void output();
int output();不构成重载。
void output(int a,int b=5);
void output(int a);
不构成重载,因为第一个函数默认了b当output(3)时不知道调用哪个函数。
5.this指针
this指针是一个隐含的指针,它是指向对象身的,代表了对象的地址。例如在对象pt.input(10,10)时,成员函数除了收到2个实参外,还接收到了pt对象的地址,这个地址被一个隐含的形参this指针所获取,它等同于执行this=&pt。所有对数据成员的访问都隐含地被加上了前缀this->。例如:x=0;等价于this->=0。
6.子类调用基类构造函数
fish():animal(300,400)
7.类的继承及访问特性
1.public 定义的成员可以被任何地方访问。
2.protected只能在基类和派生类访问。
3.private 只能在该类自身中访问。
public 继承 保持基类中访问权限不变,private不被继承
protected 继承 public变protected
private 继承 public和 protected变 private
8多重继承
多重继承只有在类似下列情况,顺序才不可乱用
class B:public C,public D
由构造函数引起的初始化发生顺序
代码依赖于B的D部分要在C部分之前初始化。这时就要改成
class B:public D,public C
激活析构函数以做清除工作的顺序。
同样,当类的其他部份正在被清除时,如果某些特别部分要何留,则该顺序也很重要。析构函数的调用顺序是按基类表说明顺序的反向进行调用的。
9.虚函数与多态性
在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。
在运行时依据对象的类型来确认调用的是哪一个函数,这种能力就叫做C++的多态性。
C++的多态性是由迟绑定技术实现的,没有在函数前加关键字virtual时,C++编译器在编译时就确定了哪个函数被调用,这叫早期绑定。
10.纯虚函数
virtual void fn()=0;
纯虚函数是指被标明不具体实现的虚成员函数(注意:纯虚函数也可以有函数体,但这种提供函数体的用法很少见)。凡是有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。在派生类中必须完全实现基类的纯虚函数,否则派生类也变为抽象类,不能实例化对象。
11.函数的覆盖
函数覆盖发生条件为
1. 基类函数必须是虚函数数。
2. 发生覆盖的两个函数要分别们于派生类和基类中。
3. 函数名称与参数列表必须完全相同。
12.函数的隐藏
函数隐藏发生的条件为
1.派生类的函数与基类的函数完全相同,只是基类的函数没有使用virtual关键字,基类的函数数都将被隐藏。
2.派生类的函数数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函数声明是否有virtual关键字,基类的函数都将被隐藏。
13.隐藏与覆盖区别
这里举个例子
class Base
{
public:
virtual fn();
};
class Class1:Base
{
public:
fn(int x);
};
class Class2:Class1
{
public:
fn();
};
Class1中的fn对Base中的fn进行了隐藏,Class2中fn对Class中的fn就行了隐藏,Class2中的fn对Base中的fn进行了覆盖。
14.引用
引用必须在声明的时候就初始化,引用一但初始化,它就代表了一块特定的内存,再也不能代表其它的内存。
引用只是一个别名,是一个变量或对象的替换名称。引用的地址没有任何意义,因此C++没有提供访问引用本身地址的方法。
引用多数用在函数的形参定义上。
15.作用域标识符
::是作用域标识符,用来标识函数和数据成员属于哪个类。如果::前面不跟类名,表示是全局函数或数据。
16.解决头文件多次包含
#ifndef XXX
#define XXX
#endif