C++ 的operator
来源:互联网 发布:陈柏霖人品怎么样知乎 编辑:程序博客网 时间:2024/06/12 00:20
C++中的operator主要有两个作用,一是操作符的重载,一是操作符的转换。
操作符重载
operator是C++关键字,用于对C++进行扩展;
- 可以被重载的操作符:new、new[]、delete、delete[]、+、-、、/、%、^、&、| 、~、!、=、<、>、+=、<<、>>、<<=、>>=、++、!= 、<=、>=、&&、||、++、–、->、->、()、[]
- 不可以被重载的操作符:、. 、 .*、 :: 、?:
- 基类对赋值操作符(=)重载不能被派生类继承;“+”操作符重载:通常,重载一个二元操作符,操作符重载函数只有一个参数。重载一个一元操作符,其函数不需要任何参数。
- 重载不能改变操作符的优先级和语法。
- []、=、()、-> 必须以类成员函数的形式进行重载。
- 除内存管理操作符new,new[],delete,delete[],一个以顶层函数形式被重载的操作符必须在他的参数表中包含一个类的对象。操作符以顶层函数实现时,至少带一个类对象参数的理由:让编译系统区分操作符是内建还是用户自定义的。
- 顶层函数:C++中有很多包含头文件,也包含很多库函数,顶层函数是object库函数。顶层函数重载操作符时,比用成员函数重载操作符时多一个参数。只要定义了可用于转型的构造函数,使用顶层函数进行重载的一个优点就是非对象操作符可以出现在操作符的左边。而使用类成员函数时,第一个操作符必须是类的对象。
- 一个类的friend函数可以访问该类的私有成员和保护成员。但该friend函数不是类的成员函数。其可以出现在类的private、public、protected的任意部分。(仅在重载操作符时使用friend函数)。
- 重载operator++操作符
C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。
然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是increment或decrement的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数:
class UPInt { // "unlimited precision int"public: UPInt& operator++(); // ++ 前缀 const UPInt operator++(int); // ++ 后缀 UPInt& operator--(); // -- 前缀 const UPInt operator--(int); // -- 后缀 UPInt& operator+=(int); // += 操作符,UPInts // 与ints 相运算 ...};UPInt i;++i; // 调用 i.operator++();i++; // 调用 i.operator++(0);--i; // 调用 i.operator--();i--; // 调用 i.operator--(0);
这个规范有一些古怪,不过你会习惯的。而尤其要注意的是这些操作符前缀与后缀形式返回值类型是不同的。前缀形式返回一个引用,后缀形式返回一个const类型。下面我们将讨论++操作符的前缀与后缀形式,这些说明也同样适用于–操作符。
#include<iostream>using namespace std;class A{public: A():value(0){cout<<"i am gouzao"<<endl;} A(A&):value(0){cout<<"i am gouzao"<<endl;}; ~A(){cout<<"xigou"<<endl;} A& operator++() { cout<<"++A"<<endl; ++value; return *this; } const A operator++(int) { cout<<"A++"<<endl; A tmp=*this; value++; return tmp; } void show() { cout<<"value:"<<value<<endl; }private: int value;};int main(){ A a; a++; a.show(); ++a; a.show(); return 0;}
操作隐式转换
class A { public: ...... operator int(){ return num; }; // 在需要情况下, 可以转成int类型对象。 ...... double num; };
0 0
- c++operator new/new operator、operator delete/delete operator的区别与联系
- 奇怪的C++operator重载
- [C++] operator new与new operator 的区别 [百面]
- operator.c
- C++Operator
- c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)
- c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)
- c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)
- c ++的operator的两种用法
- c ++的operator的两种用法
- [C/C++]_[操作符重载operator type()和operator()的区别]
- operator new和 new operator的区别(More Effective C++_8(运算符))
- C + + operator precedence list
- [C++]C++ Operator Precedence
- c语言 cast operator
- C++operator用法.
- C++operator<<函数
- C++operator重载问题
- 学霸的迷宫(bfs)
- HttpURLConnection getContentLength();返回时-1或者是0
- 初来乍到
- C++Primer第五版 第十章习题答案(11~20)
- BZOJ 2118墨墨的等式
- C++ 的operator
- Openwrt学习笔记(四)——系统开机启动
- Skip the Class
- 35. Search Insert Position
- js_json时间排序
- HTTP的无状态和转发的的理解
- 吐槽Kinect的失败与微软一贯的失败
- SpringMVC项目中配置xml时一些和命名空间相关的问题,如mvc:annotation-driven的前缀 "mvc"未绑定
- 不同浏览器获取html标签自定义属性