C++primer plus第十一章--使用类

数学是一门为不同事物起相同名字的艺术,从这点看英语是有多笨拙--------------????

运算符重载

operator op(argument-list)

重载限制:

  • 必须至少有一个操作数是用户定义的类型
  • 不能违反运算符原来句法规则,优先级
  • 不能创建新运算符
  • 不能重载一些特殊运算符:sizeof,.,.*,::,?:
  • 有些运算符只通过成员函数重载:=,(),[],->

友元函数(还有友元类,友元成员函数)

将原型放入类声明中,并加上关键字friend,注意定义中不加入friend,由于他不是成员函数,也不要使用类限定符。

重载运算符:作为成员函数还是非成员函数,成员函数其中一个操作数被隐式传递的(即通过对象调用,第一个参数必须是对象,注意参数的顺序影响调用顺序),而成员函数没用这种限制,有些运算符只能重载为成员函数。

类的自动转换和强制类型转换

C++语言不自动转换不兼容的类型如:int* p=10;但可以强制类型转换如:int* p=(int*)10;

在C++中,接受一个参数的构造函数为将参数类型转换该类类型提供了蓝图。

C++primer plus第十一章--使用类

C++新增关键字explicit关闭自动特性,因为有时并不想它总是自动转换,但不影响显式转换。

隐式转换即自动转换的场景:

  • 将对象初始化此类型
  • 将类型值赋给对象
  • 将类型值传递给接受对象类型的参数
  • 返回值被申明为对象类型却返回类型
  • 可转化为内置类型再转化为对象类型(只要不存在二义性

转换函数

构造函数只用于将某种类型转化到类类型,要进行相反的转化,必须用到C++运算符函数---转换函数。

operator typeName();(可参见上图代码)

转换函数注意点:

  • 必须是类方法,即成员函数
  • 不能指定返回类型(因为函数名已经指定了,即要转化的类型)
  • 不能有参数(因为参数就是类本身)

C++11可以用explicit消除隐式转化,原则上说,最好使用显式转换,避免隐式转换

也可以用功能相同的非转换函数代替如Xi_to_Int();

如果经常使用隐式转换,最好写一个完全匹配的函数,偶尔的话可以使用这种自动转换,但为了保险,最好使用显式转换。

注意构造函数有很多妙用,创建的临时对象虽然没有名字,可以返回。

书上一些建言

  • 不要害怕犯错误,因为再解决问题的过程中学到的知识,比生搬硬套而不犯错误时要多得多(然而不要认为所有的错误都会让人增长见识)。
  • 轻松地使用一门语言,不要觉得必须使用所有的特性,不要试图再第一次学习中就使用所有的特性。