1 访问标号
struct 默认是 public
class 默认是 private
class 可以用于定义模板参数,struct不可以
2 类成员介绍
-
成员函数
在类内定义的函数是inline函数,每个成员函数都有一个this指针,除了static成员函数 -
构造函数
2.1构造函数:
构造函数和类名相同,但没有返回值,一个类可以有多个构造函数,每个构造函数必须与其他构造函数不用数目或类型的形参。
局部作用域中的成员不被初始化,全局的成员会被初始化为0。
2.2成员初始化列表:
在冒号和花括号之间的代码成为初始化列表,初始化列表为类的一个或多个数据成员的指定初始值。成员变量的初始化值必须和变量在类中声明的顺序一致。
class A{
private:
int i;int j;
A():i(0),j(0){}
};
必须使用成员初始化列表的情况:
a) 没有默认构造函数的类类型成员
b) const类型的成员变量
c) 引用类型的成员变量
2.3复制构造函数
复制构造函数、赋值操作符、析构函数总称为复制构造。
只要类需要析构函数,它就需要复制构造函数和赋值操作符。
**复制构造函数:**只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰)。
复制构造函数可用于:
a)根据另一个同类型的对象初始化另一个对象
():直接初始化
=:复制初始化
b)复制一个对象,将它作为实参传给一个函数或从函数返回时复制一个对象
c)初始化顺序容器中的元素
d)根据元素初始化列表初始化数组元素
2.4 析构函数
构造函数不能定义成虚函数,但是析构函数可以定义成虚函数。
class A{
private:
int i;int j;
A(){}
~A(){}
};
2.5 构造函数与析构函数调用顺序
1.单继承
创建派生类对象时,首先对派生类的构造函数来调用基类的构造函数,完后基类成员的初始化,而后对派生类中新增的成员进行初始化。
派生类构造函数的一般格式
派生类名(总参数表):基类构造函数(参数表){
//函数体
};
先执行派生类的析构函数,再执行基类的析构函数,与构造函数的执行顺序相反。
2.多继承
需要调用多个基类的构造函数。
3.虚继承
调用虚基类的构造函数
2.6操作符重载
只要带“点”的都不能重载 ::: .* . ?:
输出操作符 <<的重载
ostream& operator <<(ostream& os,const classtype &object){
os<<//...
}
3成员函数的重载、覆盖、隐藏
-
成员函数的重载
成员函数被重载的特征:
a 在同一个类中
b 相同的函数名
c 不同的参数列表
d virtual关键字可有可无 -
成员函数的覆盖
覆盖是指:在派生类中覆盖基类中的同名函数,并且基类函数是虚函数(virtual),且:
a 参数个数相同
b 参数类型相同
c 返回类型相同
eg:
class A{
public :
virtual void fun(int ,int){}
];
class B:public A{
public :
virtual void fun(int ,int){}
];
覆盖的特征:
a 不在同一类中
b 相同函数名、参数
c 基类函数必须是基函数
- 成员函数的隐藏
派生类中屏蔽了基类中的同名函数:
a 两个函数参数相同,且基类函数不是虚函数
b 参数不同,且无论基类函数是不是虚函数,都会被屏蔽