一 关于运算符的重载:
运算符中有 10 种是不可重载的:
- sizeof static_cast<type>
- . dynamic_cast<type>
- .* const_cast<type>
- :: typeid
- ?= reinterpret_cast<type>
有 4 种是只可以在类中重载的:
() [] = ->
(1) 同时在重载时需要有一个参数是用户自己定义的类成员, 否则无法使用
(2) 运算符的使用方式, 及所需参数个数与重载前所需的参数个数相同
重载的格式:
- returntype operator <op> ( paramlist ){
- statements ;
- return type ;
- }
关于 << 的重载:
在重载 << 运算符时有不同, 需要返回输出流的引用:
- ostream & operator<<( ostream & os , paramlist_ ){
- statemets ; // os func as the cout
- return os ; // return the cout
- }
二 关于友元函数:
友元函数声明在类中, 加上关键字 friend 即可, 但在实现时不需要加上 friend 也不需要加上类
作用域, 因为友元函数并不属于类成员.
而之前的关于输出流重载的例子一般都是采用友元的方式来实现的.
- Defination:
- class CLASS{
- private:
- ......
- public:
- friend ostream & operator<<( ostream & os , paramlist_ );
- };
- Realization:
- ostream & operator<<( ostream & os , paramlist_ ){
- statemets ; // os func as the cout
- return os ; // return the cout
- }
ps: 在写类及其实现的函数时需要使用命名空间这样, 在编写一个较为大型的项目时会有优势.
三 关于类的类型转换:
类的类型转换分为两种, 其中第一种为强制类型转换, 第二种为自动转换.
在转换方向上也可分为由一般类型转换为类, 由类转换为一般类型.
- class Stonewt{
- private:
- enum { Lbs_per_stn = 14 };
- int stone ;
- double pounds ;
- double pds_left ;
- public:
- Stonewt(double lbs); // 由一般类型转为类的函数 1
- Stonewt( int stn , double lbs ); // 由一般类型转为类的函数 2
- Stonewt();
- ~Stonewt();
- operator int(); // 由类转换为一般类型的方法
- };
(1) 可以看出, 由一般类型转换为类是通过构造函数进行实现的一个方法, 但这会带来隐式转换的问题, 所以一般在定义时需要加上 explicit 关键字进行限定, 防止隐式转换的出现.
(2) 转换为一般函数的方式是通过定义以一般类型名为名的函数, 它属于类的成员.
同时也需要注意, 它的返回类型不再需要指定, 可以直接由函数名得到.
operator int(); 这种方式也会带来隐式转换的问题, 但在 c++98 中没法使用 explicit 关键字进行
处理, 只有在 c++11 中可以使用关键字 explicit.
来源: http://www.bubuko.com/infodetail-2661032.html