C++抽象机制之二:运算符重载
1.二元运算符aa@bb,可以定义为
1).一个参数的非静态成员函数:aa.operator@(bb); (成员函数有this指针)
2). 两个参数的非成员函数:operator@(aa,bb);
一元运算符@aa,可以定义为
1).无参数的非静态成员:aa.operator@();
2).一个参数的非成员:operator@(aa).
2.
--operator=, operator[],operator(),operator-> 只能作为非静态成员函数;
--一个运算符函数要么是成员,要么有一个参数为用户定义类型;
--不存在运算符屏蔽的问题,保证了用户可以提供新的功能而不用去修改现有功能。
--二元的operator@,x@y解析方式(顺序):类x的成员或者某个基类成员---->该环境中的operator申明----->x的名字空间---->y的名字空间
3.+=比+ & =有效,前者没有采用临时变量;混合模式算术也是通过重载实现,基础是operator+=()
4.
--构造函数的作用:通过已有类型的值构造出程序所需的类型,如:complex(double r):re(r),im(0){}
--默认的复制构造函数就是简单地复制成员,完成从用类对象取初始化同类对象;
--复制构造函数不但被用在初始化变量是,还用在参数传递、值返回、以及异常处理中?
--构造函数和转换:参数的不同组合很可能会造成组合爆炸问题,此时依赖于转换。有了complex(double r):re(r),im(0){}和bool operator==(complex,complex), 3==y<=>operator==(complex(3),y)
--转换运算符:X::operator T() ,T是一个类型名,定义了一个从x到T的转换。
(1)从用户定义类型到内部类型;(2)从新类型到已有类型,而不修改已有的类。如:INT::operator int()
5.
--成员函数:
1).访问私有;
2).位于类的作用域中;
3).该函数必须由对象激活(this指针)
1)2)->static;; 1)->friend
--若要求某运算对象是基本类型的左值,将该运算符定义为成员函数最自然(= 、+=、++等等);一个修改类对象的操作要么定义为成员函数,要么定义为非const引用(指针)全局函数;相反,若希望某个运算符所有运算对象都能隐式转换,那些不需要基础类型左值的运算符,就应该作为非成员or取const引用从参数or非引用参数。
需要访问对象内部的,(如re\im)应该作为friend。因为对象内部数据一般是作为private。
--友元函数,友元类。友元类的寻找:1)在外围前or范围内显示声明,2)用类及其派生类作为参数直接调用
6.
--为了避免复制用引用作为参数
--explicit 修饰构造函数,抑制隐式转换,避免不必要的歧义; 一般都是将只有一个参数的构造函数定义为explict
// rint.cpp : 定义控制台应用程序的入口点。
//
/************************************************************************/
/* 定义RINT使其像int */
/************************************************************************/
#include "stdafx.h"
#include <iostream>
using namespace std; struct rint
{
rint(int i):i_(i){}
rint& operator=(int i){i_=i;return *this;}
private:
int i_;
friend rint operator+(rint const&);
friend rint operator+(rint const&,rint const&);
friend rint operator-(rint const&);
friend rint operator-(rint const&,rint const&);
friend rint operator*(rint const&,rint const&);
friend rint operator/(rint const&,rint const&);
friend rint operator%(rint const&,rint const&);
friend ostream& operator<<(ostream&,rint const&);
}; rint operator+(rint const& a)
{
return a;
}
rint operator+(rint const& a,rint const& b)
{
return rint(a.i_+b.i_);
}
rint operator-(rint const& a)
{
return rint(-a.i_);
}
rint operator-(rint const& a,rint const& b)
{
return rint(a.i_-b.i_);
}
rint operator*(rint const& a,rint const& b)
{
return rint(a.i_*b.i_);
}
rint operator/(rint const& a,rint const& b)
{
return rint(a.i_/b.i_);
}
rint operator%(rint const& a,rint const& b)
{
return rint(a.i_%b.i_);
} ostream& operator<<(ostream& os,rint const& a)
{
os<<a.i_<<endl;
return os;
}
int _tmain(int argc, _TCHAR* argv[])
{
rint ri1=;
rint ri2=;
cout<<"ri1="<<ri1<<" "<<"ri2="<<ri2<<endl;
cout<<"+ri1="<<+ri1<<endl;
cout<<"ri1+ri2="<<ri1+ri2<<endl;
cout<<"ri1-ri2="<<ri1-ri2<<endl;
cout<<"ri1*ri2="<<ri1*ri2<<endl;
cout<<"ri1/ri2="<<ri1/ri2<<endl;
cout<<"ri1%ri2="<<ri1%ri2<<endl;
system("pause");
return ;
}
自定义的简单类int型
class string
{//
public:
string operator()(int left, int right)
{
check(left);check(right);
if(left<right)
{
char *a=new char[right-left+];
strcpy(a,str->left,right-left+);
a[right-left+]='';
string result(a);
delete[] a;
return result;
}
else{result string("");}
}
}
重载(),实现取子串
总结及忠告:
1).重载只是为了满足人的习惯,运算符能操作的还是只是内部类型;只不过用operator包装一下而已。
2).默认复制构造对于类不适合,需要重新定义它,或者将它禁止(声明为private).
3).将只有一个参数的构造函数做成explicit
C++抽象机制之二:运算符重载的更多相关文章
- Swift - 运算符重载和运算符函数
让已有的运算符对自定义的类和结构进行运算或者重新定义已有运算符的运算规则,这种机制被称为运算符重载. 1,通过重载加号运算符,使自定义的两个坐标结构体对象实现相加: 1 2 3 4 5 6 7 8 9 ...
- python运算符重载(二)
一.基础知识 定义:当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Python自动调用它们 特性: 1.运算符重载让类拦截常规的Python运算. 2.类可重载所有Python ...
- C++ 运算符重载二(一元运算符重载)
//一元运算符重载 #include<iostream> using namespace std; class Point { public: Point(int x,int y){ th ...
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++学习之路—运算符重载(二)运算符重载作为类的成员函数和友元函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符 ...
- C++抽象编程·运算符重载与友元函数
运算符重载(Operator overloading) 从我们在几个前篇的类的层次介绍中可以知道,C++可以扩展标准运算符,使其适用于新类型.这种技术称为运算符重载. 例如,字符串类重载+运算符,使其 ...
- 【C/C++开发】运算符重载二
C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类 ...
- C++走向远洋——47(第十二周、运算符重载基础程序、阅读)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 【C++知识汇总】运营商 & 运算符重载
[运算符] 在进行运算时,假设右括号的话我们知道先运算哪个,那假设没有括号了.算术运算符,关系运算符,逻辑运算符,位运算符.赋值运算符,++.--运算符等等,那么多的运算符.我们先算哪边 ...
随机推荐
- B/S和C/S的区别
B/S 指的是 Browser/Server : C/S 指的是Client/Server 区别: 1. B/S最大优势为客户端免维护,适用于用户群庞大,或客户需求经长发生变化的情况. C/S功能强大 ...
- javascript把IP地址转为数值几种方案,来挑战一下效率吧
先看看什么是IP地址: IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节).IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~25 ...
- Spring事务的来龙去脉
引言 Spring是一个IOC框架,在IOC框架的基础上,提供了DAO集成,AOP事务控制,JNDI等等一系列的高级功能,个人觉得,在Spring中最值得称道的不仅仅它是一个非入侵的IOC容器,而在于 ...
- C# 字符流打印类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- hdu - 1010 Tempter of the Bone (dfs+奇偶性剪枝) && hdu-1015 Safecracker(简单搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 这题就是问能不能在t时刻走到门口,不能用bfs的原因大概是可能不一定是最短路路径吧. 但是这题要过除了细心 ...
- WINCE设备开机灰屏问题(很怪异)
WINCE设备开机灰屏问题(很怪异) 1. 问题现象 图1 无法进入系统,虽然没有调试信息,但应该可以判断是程序跑飞了.我们这款产品用到3种显示屏(采用不同的驱动IC),可是测试发现1和2号屏 ...
- 《OD学hadoop》第一周0625
一.实用网站 1. linux内核版本 www.kernel.org 2. 查看网站服务器使用的系统 www.netcraft.com 二.推荐书籍 1. <Hadoop权威指南> 1- ...
- NET垃圾回收机制【Copy By Internet】
尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection),但是我们还是应该了解它们,以优化我们的应用程序.同时,还需要具备一些基础的内存管理工作机 ...
- POJ (线段树) Who Gets the Most Candies?
这道题综合性挺强的,又牵扯到数论,又有线段树. 线段树维护的信息就是区间中有多少个人没跳出去,然后计算出下一个人是剩下的人中第几个. 我在这调程序调了好久,就是那个模来模去的弄得我头晕. 不过题确实是 ...
- HDU 1231 最大连续子序列
和前面两道题一样 不过这题要求输出子序列首尾的元素的值,而且如果所有元素都小于0的话,规定子序列的和为0,并输出整个序列的首尾元素. //#define LOCAL #include <iost ...