C++多态(二)——函数重载(overloading)和操作符重载
任何函数都能重载。
一、普通函数的重载
C语言中一个函数只能处理一个类型的数据,不可能兼顾两种或多种数据类型;C++使用使用同一名称的函数来处理多个类型的数据。
#include <iostream>
#include <vector>
using namespace std; double sq(double y) //fun1
{
return y*y;
} int sq(int y) //fun2
{
return y*y;
} double sq(int y) //fun3
{
return (double)y*y;
} void main()
{
int i=;
double d=5.5;
cout<<sq(i)<<endl;
cout<<sq(d)<<endl;
}
其中的fun2和fun3冲突,因为两者的参数列表相同,不满足重载的条件。如果删掉fun3,得到答案25和30.25
所以,重载的依据是参数列表。
二、构造函数的重载
#include <iostream>
using namespace std; class A
{
int a, b;
public:
A( );
A(int i, int j);
~A( );
void Set(int i, int j)
{a=i; b=j;}
};
A::A( )
{
a=b=;
cout<<"No_arg_cons: a="<<a<<", b="<<b<<endl;
}
A::A(int i, int j)
{
a=i;
b=j;
cout<<"Constructor: a="<<a<<", b="<<b<<endl;
}
A::~A( )
{
cout<<"Destructor: a="<<a<<", b="<<b<<endl;
}
void main( )
{
cout<<"Starting first round:\n";
A obja[];
for(int i=; i<; i++)
obja[i].Set(i, i+);
cout<<"Finishing first round:\n";
cout<<"Starting second round:\n";
A objb[]={A(,),A(,),A(,)};
cout<<"Finishing second round.\n";
cout<<"Program being terminated!\n";
} Result:
Starting first round:
No_arg_cons: a=0, b=0
No_arg_cons: a=0, b=0
No_arg_cons: a=0, b=0
Finishing first round:
Starting second round:
Constructor: a=5, b=6
Constructor: a=7, b=8
Constructor: a=9, b=10
Finishing second round.
Program being terminated!
Destructor: a=9, b=10
Destructor: a=7, b=8
Destructor: a=5, b=6
Destructor: a=2, b=3
Destructor: a=1, b=2
Destructor: a=0, b=1
三、运算符重载
在面向对象程序设计语言中,运算符也是一种函数,所以运算符也能像函数一样给予重载,以便完成更多功能。
运算符重载有两种实现方式,一种作为友元函数,另一种是成员函数。
1.友元函数方式
#include <iostream>
using namespace std; class point
{
int x, y;
public:
point (int vx=, int vy=)
{
x = vx;
y = vy;
}
friend point operator + (point & p1, point & p2);
friend point operator - (point & p1, point & p2);
void print()
{
cout<<x<<" "<<y<<endl;
}
}; point operator +(point & p1, point & p2)
{
point p;
p.x = p1.x + p2.x;
p.y = p1.y + p2.y;
return p;
} //不能返回[局部变量的]引用
point operator -(point & p1, point & p2)
{
point p;
p.x = p1.x - p2.x;
p.y = p1.y - p2.y;
return p;
}
void main()
{
point p1(,),p2(,);
p1.print();
p1 = p1 + p2; //即p1= operator + (p1, p2)
p1.print();
p2 = p1 - p2; //即p2= operator - (p1, p2)
p2.print( );
}
2.成员函数方式
#include <iostream>
using namespace std; class point
{
int x, y;
public:
point() { x = ; y = ; }
point (int vx, int vy)
{ x = vx; y = vy; }
point operator + (point & p);
point operator - (point & p);
void print() {cout<<x<<" "<<y<<endl; }
};
point point::operator +(point & p)
{
point temp;
temp.x = x + p.x; //就是temp.x = this->x + p.x;两者相加
temp.y = y + p.y;
return temp;
}
point point::operator -(point & p)
{
point temp;
temp.x = x - p.x;
temp.y = y - p.y;
return temp;
}
void main()
{
point p1(,), p2(,), p3;
p3.print();
p3 = p1 + p2; //即p3 = p1.operator + (p2);
p3.print();
p3 = p3 - p1; //即p3 = p3.operator - (p1);
p3.print();
}
25
30.25
C++多态(二)——函数重载(overloading)和操作符重载的更多相关文章
- HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- (二) operator、explicit与implicit 操作符重载
有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整 ...
- 15.C++-操作符重载
首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...
- 15.C++-操作符重载、并实现复数类
首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...
- C++解析(17):操作符重载
0.目录 1.操作符重载 2.完善的复数类 3.小结 1.操作符重载 下面的复数解决方案是否可行? 示例1--原有的解决方案: #include <stdio.h> class Compl ...
- c++之旅:操作符重载
操作符重载 操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是类 那些操作符可以重载 除了下面几个操作符不能重载外,其它的操作符都能重载 . :: .* ?: sizeof 操作符重载的本 ...
- C++中采用操作符重载完善复数类
1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...
- 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数
++操作符重载 ++操作符分为前置++和后置++,比如: ++a; a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...
- C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载
1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; c ...
随机推荐
- iOS10 的适配问题,你遇到了吗?导航栏标题和返回按钮神奇的消失了
苹果系统升级后好多应用都发了新版本来适配,今天就来分享一下我的适配历程. 首先是出现的问题: 1.push一个控制器,返回按钮和标题神奇的消失了,打开三维视图(比较坑的是有的版本老到打不开三维视图 ) ...
- Synchronized和Static Synchronized区别
通过分析这两个用法的分析,我们可以理解Java中锁的概念. 一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念), 一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线 ...
- url 处理
一.jsp异步请求后台(servlet) 的url RegisterServlet 与 web.xml 的路径一样 function checkPhoneNumber(){ var phonenum ...
- 重启eclipse color theme失效的解决办法
For Eclipse Mars users: In the main menu bar, go to Window > Preferences In the preference tree o ...
- PHP的字符串函数
1.字符串的连接 字符串可以使用字符串连接符(.)来连接 常见的用途是建立大块的HTML字串代码,赋值号 (=) 连接符 (.) 可以被简写合并为 (.=) 符号 2.在字符串中使用变量 这个功能 ...
- UIView中间透明周围半透明(四种方法)
方法一 #import "DrawView.h" @implementation DrawView - (instancetype)initWithFrame:(CGRect)fr ...
- 学霸网站-Beta版本发布说明
项目名称 学霸网站 项目版本 Beta 项目团队 ourteam 发布日期 2015-1-5 一.Alpha版本实现功能简介: 1.匿名提问 2.匿名回答 3.采纳功能 4.登录.注册失败后,用户名等 ...
- 20145226夏艺华 《Java程序设计》第0周学习总结
关于师生关系: 学生和老师之间我觉得关系时多元化的,不能拘泥于单独的一种关系:灌输与被灌输,教授与被教授--我认为,在不同的课程阶段,师生之间的关系都可以发生变化.前期的老师更像是一个指路的人,而在入 ...
- Jquery插件开发学习
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...
- Java中super的几种用法并与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...