一、课堂笔记
注:转换函数无参数,不用写返回类型(但必须有返回值)。例如operator double () const {...}
注:在构造函数前加explicit 关键字可以阻止编译器隐式调用构造函数将其他类型变为构造类型。
注:point-like classes有智能指针和迭代器(一直特殊的智能指针)两种用法。
智能指针需要重载* (直接return *sp) ->(直接return sp)两个操作符,其中->操作符作用后会继续传递下去。
迭代器除了需要重载* -> 之外还需要重载== != ++(后置,无参数) ++(前置 有一个参数)
二、课后补充学习
1、在c++对象模型中对齐规则:
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中的n就是你要指定的“对齐系数”。
(1)数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐 按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
(2)结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的 数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
(3)当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
2、strust与class
从语法上,在C++中,class和struct做类型定义时只有两点区别:
(1)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
(2)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限;
(3)“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下:
struct A{}; class B : A{}; //private继承 struct C : B{}; //public继承
到底是用struct还是class,完全看个人的喜好,你可以将程序里所有的class全部替换成struct,它依旧可以很正常的运行。但最好还是:当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。
3、reference与pointer
与pointer 类似,一个reference是一个对象(object),可以用来间接指向另一个对象。一个reference的声明与pointer的声明的实质语法结构是相同的。不同的是,声明pointer的时候使用星号操作符 * , 而声明reference的时候使用地址操作符 & 。 例如:int i = 3;对于int *pi=&i;声明 pi为一个指针类型的对象,并且是一个”指向int整型的指针”,它的初始值为对象i的地址。对于int &ri = i;声明 ri为一个reference类型的对象,并且也是一个指向整型的reference,它指向的是i。
我们可以看到pointer和reference的声明有显著的不同,但这并不是决定何时使用哪一个的根据。决定的真正依据是当它们被用在表达式中时其显 示的不同决定了使用哪一个合适。
Pointer 和reference的最大不同是:pointer必须使用一个星号操作符 * 来去掉reference ,而reference不需要任何操作符来去参考。 例如, 有了上面例子中的定义, 间接表达式 *pi 将 pi 去参考为指向i。相反, 表达式ri-不需要任何操作符-自动将ri去参考为指向i。因此, 使用指针p,我们需要用赋值语句:
*p = 4;
将i的值变为4; 而使用reference ri,我们只需要直接写:
ri = 4;
就可以同样将i的值变为4 。
这个显示的不同在当你为函数的参数类型和返回值类型选择是使用pointer还是reference的时候就会显著起来,尤其是对于重载操作符的函数。