操作符重载operator
发现一篇好文:
转载:
http://www.cnblogs.com/xiehongfeng100/p/4040858.html
#include <iostream>
#include <time.h>
using namespace std;
class C{
public:
int real;
int vertual;
C(int real,int vertual)
{
this->real=real;
this->vertual=vertual;
}
C operator+(C c2)。。。。。。。。。。。作为成员函数重载
{
return C(this->real+c2.real,this->vertual+c2.vertual);
}
};
int main()
{
C one(10,30);
C two(20,11);
C three(0,0);这句话之所以这样写是因为,构造函数重载了,就不会再有默认的无参构造,要想C THREE ,可以自己再写个无参构造函数
three=one+two;
cout<<three.real<<"_____"<<three.vertual<<endl;
return 0;
}
以上是+作为成员函数重载,和普通的全局函数以及友元函数不同,作为成员函数的时候由于有this指针,双目运算符只需要一个参数,单目运算符不需要参数
还有就是在自增自减运算符重载的时候,参数列表带int 参数的,表示后置,不带int的表示前置,,,,加一个int参数只是为的方便区分前后置,,,,ex:i++。。。++i
#include <iostream>
#include <time.h>
using namespace std;
class C{
public:
int real;
int vertual;
C(int real,int vertual)
{
this->real=real;
this->vertual=vertual;
}
C operator+(C c2)
{
return C(this->real+c2.real,this->vertual+c2.vertual);
}
friend C operator-(C c1,C c2);
};
C operator-(C c1,C c2)
{
return C(c1.real-c2.real,c1.vertual-c2.vertual);
}
int main()
{
C one(10,30);
C two(20,11);
C three(0,0);
three=one+two;
cout<<three.real<<"_____"<<three.vertual<<endl;
C four(0,0);
four=one-two;
cout<<four.real<<"_____"<<four.vertual<<endl;
return 0;
}
。。。。。。。。。。。。。。。。。。。。。。。。。
是类的成员函数或变量才可以加 --------类名::,友元函数外部定义的时候不加 。。。。。类名::
对于成员函数重载运算符而言,双目运算符的参数表中仅有一个参数,而单目则无参数。同样的是重载,为什么和友元函数在参数的个数上会有所区别的。原因在于友元函数,没有this指针。
对于双目运算符而言,运算符重载函数的形参中仅为一个参数,它作为运算符的右操作数(如com2对象),而当前对象作为左操作数(如:上述中的com1对象),它是通过this指针隐含传递给成员运算符重载函数的。(转)
在运算符重载运用时应该注意以下几个问题:
(1) C++中只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符;
(2) C++中绝大部分的运算符可重载,除了成员访问运算符.,成员指针访问运算符.*,作用域运算符::,长度运算符sizeof以及条件运算符?:;
(3) 重载后不能改变运算符的操作对象(操作数)的个数。如:"+"是实现两个操作数的运算符,重载后仍然为双目运算符;
(4) 重载不能改变运算符原有的优先级;
(5) 重载不能改变运算符原有结合的特性。比如:z=x/y*a,执行时是先做左结合的运算x/y,重载后也是如此,不会变成先做右结合y*a;
(6) 运算符重载不能全部是C++中预定义的基本数据,这样做的目的是为了防止用户修改用于基本类型数据的运算符性质;
class Complex //复数类
{
private://私有
double real;//实数
double imag;//虚数
public:
Complex(double real = 0, double imag = 0)
{
this->real = real;
this->imag = imag;
}
Complex operator+(int x);
};
Complex Complex::operator+(int x)
{
return Complex(real + x, imag);
}
int main()
{
Complex com1(5, 10), total;
total = com1 + 5;
// total = 5 + com1; // 编译不通过
return 0;
}
如果我们把上述main()主函数实现部分里的total=com1+5改为total=5+com1;那么程序就会报错(没有与这些操作数匹配的 "+" 运算符),因为左操作数5不是该复数类的对象,不能调用相应的成员函数Complex operator+(int x),所以编译错误。但如果我们定义一下两个友元函数就能解决上述的问题:
1 friend Complex operator+(Complex com1, int x);
2 friend Complex operator+(int x, Complex com1);
单目运算符成员函数重载:
void operator++()
{
++this->real;
++this->vertual;
}
void operator++(int)后置
{
this->real++;
this->vertual++;
}
。。。。。。。。。。。。。
void operator++(C& c1)
{
++c1.real;
++c1.vertual;
}注意用友元函数重载单目运算符的时候要用引用,,,否则不生效,传的是一个副本。注意上边那个是前置,不用加int,,后置的时候还要多一个参数。
插入运算符"<<"是双目运算符,左操作数为输出流类ostream的对象,右操作数为系统预定义的基本类型数据。头文件iostrem对其重载的函数原型为ostream& operator<<(ostream& ,类型名);类型名就是指基本类型数据。但如果要输出用户自定义的类型数据的话,就需要重载操作符"<<",因为该操作符的左操作数一定为ostream类的对象,所以插入运算符"<<"只能是类的友元函数或普通函数,不能是其他类的成员函数。一般定义格式:
ostream& operator<<(ostream& ,自定义类名&);
提取运算符">>"也是如此,左操作数为istream类的对象,右操作数为基本类型数据。头文件iostrem对其重载的函数原型为istream& operator>>(istream& ,类型名);提取运算符也不能作为其他类的成员函数,可以是友元函数或普通函数。它的一般定义格式为:
istream& operator>>(istream& ,自定义类名&);
插入操作符重载:
#include <iostream>
#include <time.h>
using namespace std;
class test{
public:
int real;
int vertual;
test(int real,int vertual)
{
this->real=real;
this->vertual=vertual;
}
friend ostream& operator<<(ostream& o,test& t);
friend istream& operator>>(istream& i,test& t);
};
ostream& operator<<(ostream& o,test& t)
{
cout<<"out operator:"<<endl;
o<<t.real<<"..."<<t.vertual<<endl;
return o;
}
istream& operator>>(istream& i,test& t)
{
cout<<"in operator"<<endl;
i>>t.real;
i>>t.vertual;
return i;
}
int main()
{
test t(10,20);
cout<<t;
cin>>t;
cout<<t;
return 0;
}
一般的重载
class A
{
public:
A(int d) :data(d){}
A operator+(A&);//成员函数
A operator-(A&);
A operator*(A&);
A operator/(A&);
A operator%(A&);
friend A operator+(A&, A&);//友元函数
friend A operator-(A&, A&);
friend A operator*(A&, A&);
friend A operator/(A&, A&);
friend A operator%(A&, A&);
private:
int data;
}; //成员函数的形式
A A::operator+(A &a)
{
return A(data + a.data);
}
A A::operator-(A &a)
{
return A(data - a.data);
} A A::operator*(A &a)
{
return A(data*a.data);
}
A A::operator/(A &a)
{
return A(data / a.data);
}
A A::operator%(A &a)
{
return A(data%a.data);
} //友元函数的形式
A operator+(A &a1, A &a2)
{
return A(a1.data + a2.data);
}
A operator-(A &a1, A &a2)
{
return A(a1.data - a2.data);
}
A operator*(A &a1, A &a2)
{
return A(a1.data*a2.data);
}
A operator/(A &a1, A &a2)
{
return A(a1.data / a2.data);
}
A operator%(A &a1, A &a2)
{
return A(a1.data%a2.data);
}
操作符重载operator的更多相关文章
- C++ 操作符重载 (operator)
重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的.如果是二元的重载后也是二元的 下面看一个有代表性的例子:: 头文件Complex.h: #includeusing ...
- C++ 类型转换操作与操作符重载 operator type() 与 type operator()
类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换.转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的 ...
- 15.C++-操作符重载
首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...
- 15.C++-操作符重载、并实现复数类
首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- C++ operator overload -- 操作符重载
C++ operator overload -- 操作符重载 2011-12-13 14:18:29 分类: C/C++ 操作符重载有两种方式,一是以成员函数方式重载,另一种是全局函数. 先看例子 # ...
- C++的重载操作符(operator)介绍(转)
本文主要介绍C++中的重载操作符(operator)的相关知识. 1. 概述 1.1 what operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将 ...
- C++操作符重载总结operator(小结 更新ing)
操作符重载一个原则是:被操作的数据类型中 至少有一个是自定义的类型(使用class定义类),如果被操作的变量都是基本类型,那么就不能定义操作符重载. 1.如果重载了new,则必须重载delete,因为 ...
- C++ 友元(friend关键字)、类中的重载、操作符重载(operator关键字)
C++ 中友元的用法: 1.在类中使用friend关键字声明 2.类的友元可以是其它类或者具体函数 3.友元不是类的一部分 4.友元不受类中访问级别的限制 5.友元可以直接访问具体类中的所有成员. 友 ...
随机推荐
- Docker 1
1.Docker安装 下载地址:https://download.docker.com/mac/edge/Docker.dmg 验证Docker信息 docker --version docker-c ...
- linux下一个网卡配置多个ip【虚拟ip】
Linux下配置网卡ip别名何谓ip别名?用windows的话说,就是为一个网卡配置多个ip.什么场合增加ip别名能派上用场?布网需要.多ip访问测试.特定软件对多ip的需要...and so on. ...
- mysql设置索引
1.添加PRIMARY KEY(主键索引) 语法:ALTER TABLE `表名` ADD PRIMARY KEY ( `列名称` ) mysql>ALTER TABLE `table_name ...
- ExtJS模版技术
学习ExtJS一段时间以后,大家基本都会对于一些显示数据的组件不太符合需求,可能自己需要的组件在ExtJS里面不存在,这是大家基本就会使用Html属性,直接使用Html进行绘制页面数据展现. 但是,使 ...
- web service初探
概述:Web service是一个平台独立.低耦合的.自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发 ...
- 温故而知新-正则单词和strlen
1 正则表达式用\b表示单词的开始和结束 \bblog\b 正则查找blog这个单词 2 关于strlen的汉字问题 在utf8格式下 strlen('汉字')=6 在gbk格式下 strlen(' ...
- 如何从编程的本质理解JVM内存模型
如何从编程的本质理解JVM内存模型 一般聊JVM内存模型都是把图截出来,然后对着图,解释上面堆.栈之类的概念.这篇将分享下,如何从编程的本质上理解,JVM内存模型是什么样子,为什么是这个样子,不再死记 ...
- 使用Apache POI处理excel公式不更新的解决办法
使用poi更新excel时,如果单元格A设置了公式,当其依赖的其他单元格填充了值之后,导出的excel中A仍为公式而不是自动计算的值,如图: Paste_Image.png 分值小计没有更新成计算结果 ...
- ABAP-FTP通用操作
- MCI 录制指定格式音频
可先用其他格式转换软件转换一段0秒指定格式的音频,然后用mcisendstring(L"open xxx.avi alias abc",0,0,0)打开,在进行录音mcisends ...