任何函数都能重载。

一、普通函数的重载

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. 第四十三章 微服务CICD(5)- gitlab + jenkins + docker + dockerregsitry

    一.总体流程 部署: 开发机(mac) ip:11.11.11.11 docker:1.12.1 部署机(centos7) ip:10.211.55.4 docker:1.12.3 生产机(cento ...

  2. [转]VS2013自带SQL Server 的启用方法

    本文转自:http://www.icharm.me/vs2013%E8%87%AA%E5%B8%A6%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93sql-server-exp ...

  3. HTML 导航框架 (使用 Frame )

    文章出处  :  http://blog.sina.com.cn/s/blog_6f6d07f80100oqlt.html  (本文转自此博客) 在浏览网页时,我们经常会看到一个导航条,当点击导航条上 ...

  4. MyElipes遇到 source not found解决方案(查看.class文件源码一劳永逸的解决方法)

    在用Myeclipse 或者是eclipse进行开发时候经常遇到这个问题. File class editor source not found 问题.原因很简单,就是因为这是一个源码包,相应的没有编 ...

  5. 中兴MF667S WCDMA猫Linux拨号笔记

    公司最近有个国外有个项目需要用到WCDMA猫,网上简单选型了一下决定使用ZTE的型号MF667S的猫,本以为在Linux下拨号是比较简单的(之前有两款3G猫的调试经验),估计半天能搞定,结果折腾了一周 ...

  6. Phabricator部署手册

    参考:https://secure.phabricator.com/book/phabricator/article/installation_guide/ 概述 phabricator,由faceb ...

  7. HTTP Client工具类

    HTTP Client工具类: import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.ht ...

  8. 漫谈Linux内核哈希表(2)

    对照前面介绍过的内核通知链.链表,本章我们将要介绍的哈希表的初始化和定义也是如出一辙的: 点击(此处)折叠或打开 定义并初始化一个名为name的哈希链表表头 #define HLIST_HEAD(na ...

  9. 复制mueclipse项目到eclipse

    本文适用于将MyEclipse上的项目projectA检出后重命名为projectB的情况,如果只是检出projectA到Eclipse,也可以部分参考 1.从svn上检出Myeclipse项目到Ec ...

  10. 用python画xy散点图

    import matplotlib.pyplot as plt plt.plot([1,2,3],[4,5,6],'ro') plt.show()#这个智障的编辑器 这样的话,就可以画一个散点图,图中 ...