C程序设计教程操作符重载

上传人:lc****zq 文档编号:45308615 上传时间:2018-06-15 格式:DOC 页数:6 大小:51.50KB
返回 下载 相关 举报
C程序设计教程操作符重载_第1页
第1页 / 共6页
C程序设计教程操作符重载_第2页
第2页 / 共6页
C程序设计教程操作符重载_第3页
第3页 / 共6页
C程序设计教程操作符重载_第4页
第4页 / 共6页
C程序设计教程操作符重载_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《C程序设计教程操作符重载》由会员分享,可在线阅读,更多相关《C程序设计教程操作符重载(6页珍藏版)》请在金锄头文库上搜索。

1、1:可重载的操作符有:2:重载操作符必须具有一个类类型操作数 重载操作符必须具有至少一个类类型或枚举类型的操作数。不能重新定义用于 内置类型对象的操作符。3:优先级和结合性是固定不变的,除了函数调用操作符 operator(),重载操 作符时使用默认实参是非法的 4:不再具有短路求值特性,就是不能保证操作数的求值顺序 5:可以是普通非成员函数,也可以是类成员函数,如果是成员函数,则形参看 起来比操作数目少 1,第一个形参是 this一般将算术和关系操作符定义为非成员函数,将赋值运算符定义为成员函数操作符定义为非成员函数是,通常必须将他们设置为所操作类的友员重载操作符的设计:重载操作符的设计:

2、1:不要重载具有内置含义的操作符,重载逗号,取地址,逻辑与,逻辑或等操 作符都不是好的做法 2:大多数操作符对类对象没有意义 3:如果一个类有算术操作符,或位操作符。那么提供相应的复合赋值操作符一 般是一个好的做法 4:相等和关系操作符,将要用作关联容器键类型的类应该定义等操作符必须定义为成员,将 这些定义为非成员函数将在编译时候标记错误 b:像赋值一样,复合赋值操作符通常为类的成员,但不这样做不会标记错误 c:改变对象状态或与给定类型紧密联系的其他一些操作符,如自增,自减,解 引用,通常为类成员 d:对称的操作符,如算术,相等,关系和位操作符,最好定义为普通非成员函 数14.2 输入输出操作

3、符 必须处理错误和文件结束的可能性 如果可能,要确定错误恢复措施,指出错误,通常仅需设置 failbit。设置 eofbit,表示文件结束,badbit 流被破坏14.3 算术操作符和关系操作符 为了与内置操作符保持一致,加法返回一个右值,而不是一个引用=操作符 表示两个对象是等价的 设计原则: if 类定义了=,该操作符的含义是两个对象包含同样的数据 if 类具有一个操作,能确定该类型的两个对象是否相等,通常将该函数定义为 operator=,而不是创造命名函数。 if 定义了=,则应该定义!= 应该及那个着两个操作符联系起来,一个完成实际比较工作,另一个调用前者 inline bool o

4、perator= (const sales_item inline bool operator!=(const sales_item 14.4 赋值操作符 一个类可以有多个赋值操作符 string 类包含以西的成员: class string public: string string string . ; string car(“volks“); car = “studet“; string model =p;赋值必须返回对*this 的引用,必须为成员函数14.5 下标操作符 必须定义为类成员函数类定义下标操作符,一般需要定义两个版本,一个为非 const 成员并返回引用, 另一个为 co

5、nst 成员并返回 const 引用 class Foo public: int const int private: vector data; ;14.7 自增自建 着两个操作符通常由诸如迭代器这样的类实现,例如,可以定义一个类,该类 指向一个数组并为该数组中的元素提供访问检查。这个指针类可用于任意类型 的数组, class CheckPtr pubilc: checkptr(int *b, int *e) beg(b),end(e),curr(b) private: int* beg; int* end; int* curr; public; checkedPtr checkedPtr ;

6、因为改变操作对象的状态,所以更倾向于将他们作为成员,并返回引用3 区别操作符的前缀和后缀 普通重载不能区别所定义的是前缀还是后缀,用一个额外的 int 型形参指定 后缀比前缀复杂一点,要记住增 1 和减 1 前的状态定义了调用操作符的类,其对象常称为函数对象,行为类似与函数class GT_cls pubic: GT_cls(size_t val=0); bound(val) bool operator() (const string private: std:string:size_type bound; 标准库中定义了很多类似于这样的函数对象,函数对象的函数适配器 两种函数适配器: 绑定器

7、:将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象 求反器:将胃词函数对象的真值求反标准库定义了两个绑定器适配器: bind1st:将给定值绑定到二元函数对象的第一个实参 bind2st:。第二个实参count_if(vec.begin(), vec.end(), bind2nd(less_equal(), 10); 改适配器用 10 做右操作数应用(), 10); 对那些不是= dval; /si -int ;int -double if(si) /si-int ;iint -boolint cals(int); SmallInt si; int i = calc(si); /co

8、nvert si to int and call calccoutint使用转换函数时,被转换的类型不必与所需要的类型完全匹配,很多时候在类 类型转换后跟上标准转换已得到相应的类型但是只能应用一个类类型转换,在类类型转换之后不能再跟另一个类类型转换, 否则出错 例如: class Intergral public; Intergeal(int i=0):val(i) operator SmallIn() const return val%256 private: std:size_t val; ; 可以在需要 SmallInt 的地方使用 Intergral,但不能在需要 int 的地方使用

9、Intergral int calc(int); Intergral intVal; SmallInt si(intVal); /ok int i = calc(si); /ok int j = calc(intVal) /error标准转换可在类类型转换之前14.9.3 实参匹配和转换 这一节介绍怎样用类类型转换将实参和对应形参想匹配一般而言,给出一个类与两个内置类型之间的转换是不好的做法 避免二义性的最好方法:保证最多只有一种途径将一个类型转换为另一个类型, 限制转换操作符的数目,尤其是到一种内置类型应该只有一个转换。14.9.4 重载确定和类的实参 class SmallInt publ

10、ic: operator int() constreturn val; operator double() const return cal; private: val; : void compute(int);void compute(doule); void compute(long double) SmallInt si; compute(si) /error 明显的二义性 进行显式强制转换削除二义性 如果是 compute(static_cast(si); /ok标准转换和构造函数 class SmallInt public: SmallInt(int =0) ; class Intr

11、gral public: Integral(int=0); void manip(const Integral void manip(const SmallInt manip(10); /error 明显二义性 用显式构造函数调用削除二义性: manip(SmallInt(10); manip(Intrgral(10);在调用重载函数时候,需要使用构造函数或强制类型转换来转换实参,这是设 计拙劣的表现正确设计类的重载操作符,转换构造函数和转换函数需要多加小心,尤其是如果类既定义 了转换操作符有定义了重载操作符,容易产生二义性。下面几条经验: 1 不要定义相互转换的类 2 避免到内置算术类型的转换,具体而言,如果定义了到算术类型的转换,则: 不要定义接受算术类型的操作符的重载版本 不要定义转换到一个以上算术类型的转换

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号