C++ 第十四章笔记 类继承
静态联编
编译过程将函数调用解释为执行特定代码块
动态联编
在运行过程指定运行的代码块
虚函数工作原理
每个对象都包含一个隐藏成员来存放指向函数地址数组的指针,这种数组称为虚函数表,虚函数表中存储了为类对象进行声明的虚函数的地址。
使用虚函数的代价:
每个对象都增大,增大了量为存储地址的空间。
对于每个类,编译器都创建一个虚函数地址表。
对于每个函数调用,都需要执行一项额外的操作,即到表中查找地址。
静态联编
编译过程将函数调用解释为执行特定代码块
动态联编
在运行过程指定运行的代码块
虚函数工作原理
每个对象都包含一个隐藏成员来存放指向函数地址数组的指针,这种数组称为虚函数表,虚函数表中存储了为类对象进行声明的虚函数的地址。
使用虚函数的代价:
每个对象都增大,增大了量为存储地址的空间。
对于每个类,编译器都创建一个虚函数地址表。
对于每个函数调用,都需要执行一项额外的操作,即到表中查找地址。
虚函数跟类继承函数的区别
继承的话 是有两个版本一个是子类版本 一个是父类版本具体调用哪个则看当前类所代表的类型 如果是虚函数的话则当前类会只有一个版本就是当前的类 并且虚函数是必须得覆盖的
类的特殊成员函数有以下
c++11增加了如下:
c++表示空指针用nullptr;
如果
2.75*a;
这种的话就算在a类里面重载了运算符*号的话也不会执行重载运算符
解决这种方案就是定义一个非成员的重载函数
Time operator*(double m,const Time & t);
这种方式的重载函数是无法更改类里面的私有函数的 可以使用友元方式来解决
friend operator*(double m,const Time & t);
重载运算符 只能选择非成员重载方式或者成员重载方式其一。
如果类的构造函数是
Stonewt::Stonewt(double lbs)
{
....
}
那么可以采用
Stonewt myCat;
myCat = 19.6;
如果要将myCat转化为double则要重定义转换函数格式是:
operator typeName();
C++类的默认访问控制权限是private
C++类中 每个实例的类的代码段是一样的,但是每个实例的数据段是不一致的。
常见的给c++成员命名前缀为:m_ 或者后缀带_ 这样可以区分参数与成员
给对象数组批量初始化可以使用以下:
Stock stocks[4]={
Stock("NanoSmart",12.5,20),
Stock("Boffo Objects",200,2.0),
Stock("Monolithic Obelisks",130,3.25),
Stock("Fleep Enterprises",60,6.5)
};
初始化对象数组的实现原理是用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。
作用域内枚举c++11
enum egg {Small,Medium,Large,Jumbo};
enum t_shirt{Small,Medium,Large,Xlarge}; //这种形式是会报错的因为两个类型里面的元素冲突
c++11提供了如下方法:
enum class egg {Small,Medium,Large,Jumbo};
enum class t_shirt{Small,Medium,Large,Xlarge};