C++一些注意点之操作符重载
重载操作符需要注意
(1)重载操作符必须具有一个类类型操作数。不能重载内建类型的操作符。
operator +(int,int);//这个是错误的,都为内建类型
operator +(int,classType);//可以改成这样,保证有一个自定义类型
(2)重载操作符可以定义为普通非成员函数或者类的成员函数。当定义为类的成员函数,默认含有一个this指针,作为一个参数;当定义非成员函数时,通常必须将它们设置为所操作类的友元。
(3)调用重载操作符有两种方式:隐式调用,显示调用。
cout<<item1+item2<<endl;//隐式调用重载操作符
cout<<operator +(item1,item2);//非成员函数的重载操作符,显示调用
cout<<item1.operator +( item2);//成员函数的重载操作符,显示调用
重载操作符的几条准则
(1)重载操作符时定义时,按照常规的习惯去重载。例如“==”可以被重载为测试两个对象是否相等;
(2)如果一个类有算术操作符或位操作符重载,那应该提供相应的符合赋值操作符重载。
(3)将要用关联容器键类型的类定义“<”操作符重载。因为关联容器默认使用键类型的<操作符。即使该类型将只存在顺序容器中,类通常也应该定义相等(==)操作符和小于(<)操作符,理由是许多算法假定这些操作符存在。例如sort使用”<”,find使用“==”。如果类定义了”==”操作符,也应该定义“!=”操作符。类定义了”<”,也可能会定义“>,>=,<=,<”。
(4)如何选择成员函数还是普通函数:赋值(=)、下标[]、调用()、成员访问箭头->、复合赋值、++、--等定义为类的成员;对称的操作符、比较操作符最好定义为普通函数(类的友元函数)。
几个常用的重载方式
(1)输入和输出操作符
friend ostream& operator<<(ostream& out,const classType& obj);
template<class T>
friend ostream& operator<<<T>(ostream& out,const classType<T>& obj); friend istream& operator<<(istream& in, classType& obj);
template<class T>
friend istream& operator<<<T>(istream& in, classType<T>& obj);
(2)算术操作符和关系操作符重载
friend classType operator +(constclassType&op1,const classType &op2);
(3)赋值操作符重载
类赋值操作符接受类类型形参,通常该形参是对类类型的const引用,但也可以是非const类型的引用。如果没有定义这个操作符,则编译器将合成它。类赋值操作符必须是类的成员,以便编译器指定是否需要合成一个。可以为一个类定义许多附加的赋值操作符。赋值必须返回对*this的引用。
string& operator=(const string&);
string& operator=(const char*);
string& operator=(char);
(4)下标操作符重载
下标操作符出现在左边必须生成左值,可以指定引用作为返回类型而得到左值。只要下标操作符返回引用,就可以作赋值的任意一方。可以对const和非const对象使用下标也是个好主意。应用const对象时,返回值为const引用,因此不能作为赋值目标。
int& operator[](const size_t index)
{return data[index];}
const int& operator[](const size_tindex) const
{return data[index];}
(5)成员访问操作符重载
箭头操作符必须定义为类的成员函数,解引用操作符不要求定义为成员。解引用和箭头操作符在实现智能指针的类中。
class screen{
public:
    screen& operator*(){return *ptr->sp;}
    screen* operator->(){return ptr->sp;}
    const screen& operator*()const
    {return *ptr->sp;}
    const screen* operator->()const
    {return ptr->sp;}
private:
    scrPtr *ptr;
};
重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类对象。若返回类型为指针,则直接用该指针。若返回为定义了箭头操作符的对象,调用箭头操作符则递归调用返回对象的箭头操作符,如果返回对象没有定义箭头操作符,编译器将报错。
(6)++操作符重载
classType& operator++();//前缀式
classType& operator++(int);//后缀式
classType& operator++(int)
{
classType ret(*this);
++*this;//调用前缀式
return ret;
}
classType obj;
obj.operator++();//显示调用前缀式
obj.operator++(0);//显示调用后缀式
C++一些注意点之操作符重载的更多相关文章
- c++ 操作符重载和友元
		操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ... 
- paip.操作符重载的缺失 Java 的一个大缺点
		paip.操作符重载的缺失 Java 的一个大缺点 #----操作符重载的作用 1.提升用户体验 操作符重载..可以让代码更加自然.... 2.轻松实现代码代码移植 例如 java代码会直接移植到 ... 
- C#中如何利用操作符重载和转换操作符
		操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ... 
- 操作符重载.xml
		pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ... 
- [置顶]        operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
		operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ... 
- C++基础学习笔记----第十三课(操作符重载-下)
		本节主要讲使用成员函数重载操作符,包括[],=,(),->四种操作符的重载以及&&和||的问题. 类的成员函数进行操作符重载 基本概念 类的成员函数也可以进行操作符的重载.类的普 ... 
- 再议Swift操作符重载
		今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险.正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了.它可以令你的代码更加简洁,也可以让 一个函数调用变得又 ... 
- C++中的操作符重载
		一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ... 
- C++ operator overload -- 操作符重载
		C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 # ... 
随机推荐
- C#程序中:如何向xml文件中插入节点(数据)
			向xml文件中动态的添加节点(数据)是一件很爽的事,可以给你的程序带来很多的方便,比如在web中,如果你的Flash用到了xml文件,这个方法可以让你在后台就轻轻松松的更新你的Flash内容哦!一起研 ... 
- Ext.String 方法
			1.Ext.String.htmlEncode(value); 编码字符串,对其中特殊字符进行转义 xt.String.htmlEncode("hello'world"); //& ... 
- Scroll view 备忘
			Stroyboard中使用ScrollView 当我们使用Storyboard开发项目时,如果要往控制器上拖入一个ScrollView并且添加约束设置滚动区域,是有特殊的规定的: 拖入一个scroll ... 
- 拦截QT关闭窗口的CloseEvent
			QDialog类下有一个虚函数 void QDialog::closeEvent ( QCloseEvent * e ) [virtual protected] 通过实现closeEve ... 
- JSON取代XML?--JSON入门指南
			定义 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C# ... 
- PHP 7 探针的安装与测试
			首先,这是一篇软文,没错!就是一篇软文.因为我知道「PHP 是世界上最好的语言」,所以我相信很多人愿意读这篇用户帮忙写的软文,因为这篇软文应该能帮助 PHP 开发的同学一点小忙.我们是一家成立了7年的 ... 
- 解读Hashtable
			http://perhaps.cnblogs.com/archive/2006/01/06/312335.html 昨天看到了叶漂兄的Post:<Hashtable的烦恼!>,文中提出有关 ... 
- Greg and Array
			Codeforces Round #179 (Div. 2) C:http://codeforces.com/problemset/problem/296/C 题意:给你一个序列,然后有两种操作,第一 ... 
- Android 两个Activity进行数据传送 发送
			Activity1:: Intent intent= new Intent(this, OtherActivity.class); String name = "heyiyong" ... 
- Java中static作用及用法详解(转)
			1.1概述: static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存 ... 
