c++类【开端】
运算符重载
方式:operator运算符(参数列表){}。
运算符就是:+-*/[]等。
运算符重载,和定义一个方法效果是一样的,只是,重载运算符让类的+-*/等操作看起来和普通数字的+-*/一样。仅是看起来一样。我们重载运算符,就是在做这个表面上看起来一样的背后的运行规则。就是说,为了看起来一样,重载运算符在负重前行。
重载的限制
不是所有的运算符都可以重载。
重载运算的操作数至少要有一个自定义的类型。
运算规则要和之前一样,
还有一些不能重载的运算符。
还有一些只能重载为成员函数的运算符:=()[]->这4个,只能通过成员运行符重载。
延伸:左侧操作数必须是调用对象。
友元
为何需要友元?因为重载运算符左侧操作数必须是调用对象,导致有些运算重载运实现不了。比如A*3重载可以,但3*A就没法操作了。也不能用非成员函数,因为非成员函数不能访问类的内部数据。这不就尴尬了么。所以用友元来解决。友元可以访问对象的内部数据。
友元分三种:友元函数,友元类,友元成员函数。
友元函数:不是类的成员函数,只是把原型写在类的声明里,并以friend开始。告诉类这是个友元函数,不需要在类里实现,友元函数的定义就和普通函数一样,只是在类里用friend声明一下。
重载的运算符一般应设计成友元函数,这样,可以访问类的私有数据。
类型转换
自动转换与强制转换:
自动转换也可以称作 是隐式转换。转换就涉及转换函数,函数就是要定义的,但是,有些构造 函数可以转为转换函数。比如:只有一个参数的构造函数能够转换成转换函数。
这种默认的转换在实践中发现有时不好用,所以,有些人在定义构造函数的时候,在前面加一个explicit关键字,这就是在告诉类,这个构造函数不能进行自动转换,必须要显示的调用才能转换。构造函数,只适用于将其它类型转换为自己类的这种转换,但是,如果反过来,要将类转换为其它类型。侧需要转换函数了。
转换函数是用户自定义的强制类型转换。原型写法:operator 类型名();没有返回类型一说。
转换函数必须是类的方法,没返回值,也没有参数。但是定义里,必须返回转换后的值。
总结
访问类的成员,唯一方法就是通过使用类的方法,但是友元避开了这个限制,解决了一些不能用的场景。
运算符重载,运算符函数可以是成员函数,也可以是友元函数,但是一般建议定义成友元函数,可以避开第一个操作数必须是类对象的限制。
转换函数,就是将类转换为其它类型,一般要自定义。还有就是将其它类型转换为类,这个一般可以通过只有一个参数的构造函数自动转换,通过要构造函数前加explicit可以限制自动转换,只能显性调用转换,减少出错。