《C++ primer plus》第十一、十二、十三章 学习笔记

来源:互联网 发布:宁波软件培训学校 编辑:程序博客网 时间:2024/04/28 13:20

一、操作符重载

1.返回引用可以提高效率,但是不能返回指向局部变量或临时变量的引用,因为函数一旦执行完毕,该对象将消失
2.重载限制:
(1)重载的操作数中至少有一个是用户自定义的类型
(2)使用操作符是不能违反原来的句法规则,不能修改操作符的优先级
(3)不能定义新的操作符
(4)以下操作符不能重载:sizeof,.(成员操作符U),*(成员指针操作符),::(作用域解析操作符),?:(条件操祖父),typeid,const_cast,dynamic_cast,reinterpret_cast,static_cast
(5)只能通过成员操作符进行重载:=(赋值操作符),(),[](下标操作符),->
3.一些操作符重载的例子:(以Time为类)
friend ostream& operator<<(ostream&,const Time&);friend istream& operator>>(istream&,Time&);Time& operator=(const Time&);
4.在重载操作符时,友元函数和成员函数只能选择一种

二、友元简介

1.友元有三种:友元函数,友元类,友元成员函数,友元具有和类成员函数相同的访问权限
2.类的二元操作符的重载经常用到友元
3.类的成员函数的定义需要使用Time::限定符,而友元函数不使用该限定符

三、类的自动类型转化和强制类型转化

1.定义类特定的常量,可以在类里声明:enum {i = 14} 或 static const int i = 14
2.隐式转化
(1)类的构造函数中包含接受一个参数时可以使用隐式转化,如
Stonewt My;
My = 19.6;
可以使用explicit关键字来关闭这种特性
当且仅当转化不存在二义性时,才可以使用隐式转化
(2)转化函数
上面例子中的隐式转化可以将double转化为类,那么可以做相反的转化吗?
事实上是可以的,需要使用转化函数,转化函数是用户定义的强制类型转化
operator typename();
如operator int();
注意:转化函数必须是类方法,不能有参数,不能指定返回类型


Stonewt::operator double(){
return pounds;
}


转化函数也是隐式转化,理论上来讲,应该尽量避免隐式转化,最好使用显式转化,但是关键字explicit不能用于转化函数,但是可以用一个功能相同的函数来代替该转化函数
如:
double Stonewt::To_doulbe()const{
return pounds;
}
3.转化函数与友元函数
过多的转化函数容易造成混乱,因此,将加法之类的操作符定义为友元函数能更好地适应自动类型转化

四、动态内存和类

1.静态成员
(1)所有的对象共享同一个静态成员
(2)不能在类声明中初始化静态成员变量,这是因为声明不分配内存,同时初始化是在方法文件中的,不能在类声明文件中进行,因为类声明位于头文件,程序可能将头文件包括在其他几个文件中,从而引发错误
(3)不能通过对象调用静态成员函数(但是可以通过对象调用静态成员),只能通过类名和类作用域解析符进行调用,且静态成员函数只能使用静态成员
有一种例外情况就是静态成员为整型或枚举型const
2.隐式成员函数:默认构造函数,复制构造函数,赋值操作符,默认析构函数,地址操作符
3.使用显式复制构造函数/赋值操作符的两种情况:包含static静态成员,需要使用深复制

五、类继承

1.不同类型的继承特征公有继承 保护继承私有继承公有成员变成派生类的公有成员 保护成员私有成员保护成员变成派生类的保护成员保护成员私有成员能否隐式向上转化是是(但只能在派生类中)否

2.派生类构造函数必须使用基类构造函数,使用成员初始化语法(注:非构造函数不能使用成员初始化语法)
3.基类指针和应用都可以在不在显式类型转化的情况下指向或引用派生类对象,同样,可以将派生类对象赋给基类对象
4.派生类=操作符的重载:
Father::operator=(son)
5.虚方法
(1)如果没有使用关键字virtual,程序将根据引用类型或指针类型选择方法,如果使用了virtual,程序将根据引用或指针指向的对象来选择方法
(2)方法在基类被声明为虚函数后,它在派生类自动成为虚方法,不过在派生类声明中使用virtual也不失为一个好方法
(3)构造函数不能为虚函数,析构函数应该为虚函数,友元函数不能是虚函数
(4)在派生类成员函数中,可以使用作用域解析运算符来调用基类方法
6.静态联编和动态联编
将源代码中的函数调用解释为特定的函数代码块被称为函数名联编(binding)。在没有虚函数时候,编译器在编译过程中就可以完成这种联编,即便有函数重载是也可以看调用函数使用的参数来决定,这种模式叫静态联编,也叫早期联编。有了虚函数时候,就得看虚函数被谁调用了,这个时候编译器必须在运行时选择正确的虚方法的代码,这时候就叫动态联编
7.将派生类引用或指针转化为基类引用或指针被称为向上强制转化,向上强制转化是允许的
但是将基类引用或指针转化为派生类引用或指针(即向下强制转化)如果不使用显示转化,是不允许的
8.抽象基类
(1)C++使用纯虚函数(在函数声明的结尾添加=0)使某个类变为纯虚函数,即不能创建该类的对象,但是纯虚函数允许有定义


0 0
原创粉丝点击