1、内联函数 inline()
2、Constexpr()函数
3、递归函数
4、函数的重载
5、构造函数、析构函数、复制构造函数、浅复制&深复制、new &deleye[]
6、函数功能声明 func::func() int func::name();
7、静态数据成员、静态成员函数 静态数据成员的特性及其声明
静态成员:为同一个类不同对象数据成员提供一个共享机制;
(1)静态数据成员:
1)静态数据成员是属于类的,对于普通的数据成员,每个对象都会生成副本,对于 静态数据成员,每个类只含有一个静态成员
2)声明: int person::nun = 0;
3)范围:不在public与private 之内,声明不在main 与class 内;
(2)静态函数成员:
1)静态函数成员不是某一个类的成员函数而是属于整个类;
2)静态成员函数可以直接访问静态成员函数,可以通过对象访问普通数据成员;
3)使用:person::num(); 或者 chen.num();
8、友元函数、友元类;
1) 友元不能传递与继承是单向进行的;
2)友元可以访问类中的私有数据;
9、引用
int a;
Int &b=a; //此处b是a的别名,对于b的操作等于对于a 的操作,b指向的位置等于 a的存储位置;
一个变量引用只能引用一次,不能再次引用成为其他变量的别名
10、常对象
(1)常数据成员:
①静态常数据成员:只能在类外用 const int A::num = 0;初始化
②常数据成员:可以在构造函数的初始化列表进行初始化:
public A{
const int a,b; //可以在public或者private或者private
}
A::A(int i):a(i),b(i),c(i)
(2)常对象:不能改变常对象的值;
(3)常成员函数
11、this指针的使用,new与delete的使用
12、继承:public、protect、private;
13、派生:
(1)吸收基类中除构造函数和析构函数之外的所有成员,当你在派生类中没有写构造函数的时候,系统会自动生成一个空的构造函数,此时没有初始化数据的功能,下一步去寻找基类的构造函数,完成数据的初始化功能。
(2)改造基类中的成员,不同的继承方式以及同名屏蔽不想要的函数;
(3)添加新的成员;
14、派生类的构造函数
(1)派生类的构造函数不仅要初始化继承过来的成员变量还要初始化自己新增的成员变量,所以还需要调用基类的构造函数完成基类继承过来的成员变量
Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s),age(a),addr(ad){}
在执行派生类构造函数的时候,会先执行基类的构造函数,是否明确指出调用基类的构造函数,基类的构造函数还是会先执行的。
15、派生类的析构函数
16、多继承
(1)class MDerivedB: public BaseA2, public BaseA1, public BaseA3
先执行构造函数A2->A1->A3->MDeriverdb;
(2)避免二义性,当同时继承相同名字的成员
BaseA1::print();
BaseA2::print();
BaseA3::print();
(3)Virtual虚基类
在多重继承的使用很容易出现二义性,或者多次继承同一个基类的成员,虽然通过域操作符可以一定程度上解决这个问题,但是在派生类中还是会存在副本,可以在继承的时候这样定义:
class A{}
Class B: virtual public A{}
Class B1:virtual public A{}
Class C:public B,public B1{}
上述这样定义可以让多继承过来的同名成员在内存中只有一个副本,从根本上解决二义性的问题;但多继承在编写和维护的时候会增加难度,所以尽量避免多继承。
17、静态联编&&动态联编
(1)静态联编时同名覆盖,但涉及到对象指针的时候,基类的指针指向派生类的对象,但调用同名函数的时候还是调用基类的函数;
(2)动态联编:相对一静态联编的不够灵活,动态联编更灵活,可维护性更好,不过速度比静态联编慢;
①Virtual 虚函数:动态联编的只要实现方式,是动态联编的基础;
1)静态成员函数不能为虚函数
2)内联函数不能为虚函数
3)构造函数不能为虚函数
(3)多态:
简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际 子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。 所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法
18、模板
(1)函数模板
Template <typename T>
T abs(T a)
{
return a>0?-a:a;
}
(2)类模板
template <class T> //T为模板参数
class Square
{
public:
Square(T y):x(y){} //T的具体类型根据
T fun() //类模板的调用情况确定
{
return x*x;
}
private:
T x;
};
void main()
{
Square <int> inta(15); //T置换为int生成模板类,并创建对象inta
Square <float> floata(16.5); //T置换为float的模板类,并创建对象floata
Square <double> doublea(15.55);//T置换为double的模板类,并创建对doublea
cout<<"square of int data:"<<inta.fun()<<endl;
cout<<"square of float data:"<<floata.fun()<<endl;
cout<<"square of double data:"<<doublea.fun()<<endl;
}
19、STL
STL主要组成:
●迭代器(iterator)
●算法(algorithms)
●容器(container)
●函数对象(function objects)
●适配器(allocators adapter)
容器和算法通过迭代器可以进行无缝连接。(string也可以认为是STL的一部分)