C++primer plus第十一章--使用类
数学是一门为不同事物起相同名字的艺术,从这点看英语是有多笨拙--------------????
运算符重载
operator op(argument-list)
重载限制:
- 必须至少有一个操作数是用户定义的类型
- 不能违反运算符原来句法规则,优先级
- 不能创建新运算符
- 不能重载一些特殊运算符:sizeof,.,.*,::,?:
- 有些运算符只通过成员函数重载:=,(),[],->
友元函数(还有友元类,友元成员函数)
将原型放入类声明中,并加上关键字friend,注意定义中不加入friend,由于他不是成员函数,也不要使用类限定符。
重载运算符:作为成员函数还是非成员函数,成员函数其中一个操作数被隐式传递的(即通过对象调用,第一个参数必须是对象,注意参数的顺序影响调用顺序),而成员函数没用这种限制,有些运算符只能重载为成员函数。
类的自动转换和强制类型转换
C++语言不自动转换不兼容的类型如:int* p=10;但可以强制类型转换如:int* p=(int*)10;
在C++中,接受一个参数的构造函数为将参数类型转换该类类型提供了蓝图。
C++新增关键字explicit关闭自动特性,因为有时并不想它总是自动转换,但不影响显式转换。
隐式转换即自动转换的场景:
- 将对象初始化此类型
- 将类型值赋给对象
- 将类型值传递给接受对象类型的参数
- 返回值被申明为对象类型却返回类型
- 可转化为内置类型再转化为对象类型(只要不存在二义性)
转换函数
构造函数只用于将某种类型转化到类类型,要进行相反的转化,必须用到C++运算符函数---转换函数。
operator typeName();(可参见上图代码)
转换函数注意点:
- 必须是类方法,即成员函数
- 不能指定返回类型(因为函数名已经指定了,即要转化的类型)
- 不能有参数(因为参数就是类本身)
C++11可以用explicit消除隐式转化,原则上说,最好使用显式转换,避免隐式转换
也可以用功能相同的非转换函数代替如Xi_to_Int();
如果经常使用隐式转换,最好写一个完全匹配的函数,偶尔的话可以使用这种自动转换,但为了保险,最好使用显式转换。
注意构造函数有很多妙用,创建的临时对象虽然没有名字,可以返回。
书上一些建言
- 不要害怕犯错误,因为再解决问题的过程中学到的知识,比生搬硬套而不犯错误时要多得多(然而不要认为所有的错误都会让人增长见识)。
- 轻松地使用一门语言,不要觉得必须使用所有的特性,不要试图再第一次学习中就使用所有的特性。