任何函数都能重载。

一、普通函数的重载

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)和操作符重载的更多相关文章

  1. HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  3. (二) operator、explicit与implicit 操作符重载

      有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整 ...

  4. 15.C++-操作符重载

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

  5. 15.C++-操作符重载、并实现复数类

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

  6. C++解析(17):操作符重载

    0.目录 1.操作符重载 2.完善的复数类 3.小结 1.操作符重载 下面的复数解决方案是否可行? 示例1--原有的解决方案: #include <stdio.h> class Compl ...

  7. c++之旅:操作符重载

    操作符重载 操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是类 那些操作符可以重载 除了下面几个操作符不能重载外,其它的操作符都能重载 . :: .* ?: sizeof 操作符重载的本 ...

  8. C++中采用操作符重载完善复数类

    1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...

  9. 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数

    ++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...

  10. C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载

    1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; c ...

随机推荐

  1. 图片缩放应用(nearest / bilinear / three-order interpolate)

    typedef xPixel PIXELCOLORRGB; double Sinxx(double value){ if (value < 0) value = -value; if (valu ...

  2. Struts2 验证框架 validation.xml 常用的验证规则

    validation.xml 的命名规则和放置路径: 文件名:<ActionClassName>-validation.xml <ActionClassName>就是要验证的A ...

  3. NPOI简单应用

    打开或创建文件 fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); 不同版本的workbook if ...

  4. Mac下 Octave 中plot 无法绘制

    在coursera看机器学习课程的时候用到Octave来做数据处理,但是装了之后用plot画图时就会报错: set terminal aqua enhanced title "Figure ...

  5. getElementByName()和getElementById的区别

    因为在属性中,id时唯一的,getElementById取出的是一个元素但是可以出现相同的name,取到的是一个Array ,getElementsByName取出的是数组 记录代码如下: <! ...

  6. eclipse中安装adt插件

    对于程序开发的学者来说,eclipse并不陌生,它为我们提供了一个非常广阔的平台来开发程序.同样我们也可以用它来开发android程序.但是在eclipse中并不能直接开发android程序,需要我们 ...

  7. GPU高性能计算-CUDA

    前段时间有个同学的毕设是搞并行计算的,他基本不懂编程把我拉过去帮忙,我之前也没弄过,帮着搞了2天.先把代码贴上去,等有时间在把详细补充一些内容. CUDA编程主要是利用了显卡优越的并行计算能力,把一个 ...

  8. ps 的一些小东西

    1.画圈 画框 新建图层--矩形选框工具(U)--左上角选 '路径'--画圆/画框--编辑(右键)--描边--ok. 2 ctrl+t 大小变换问题

  9. Jquery基础知识

    //使用$操作得到的对象,都是Jquery对象 如何把Jquery对象转换成dom对象?$abc 方法1:var div = $div.get(0) 方法2:var div = $div[0] 如何把 ...

  10. CSS里常见的块级元素和行内元素

    根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级 ...