任何函数都能重载。

一、普通函数的重载

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. 利用GCTA工具计算复杂性状/特征(Complex Trait)的遗传相关性(genetic correlation)

    如文章"Genome-wide Complex Trait Analysis(GCTA)-全基因组复杂性状分析"中介绍的GCTA,是一款基于全基因组关联分析发展的分析工具,除了计算 ...

  2. MVC将服务器端的物理路径转换为服务器路径

    以图片为例 后台Controller.cs public FileResult ImageUrl(string file) { return File("物理路径"+file, & ...

  3. Spark standalone HA

    配置Spark standalone HA 主机:node1,node2,node3 master: node1,node2 slave:node2,node3 修改配置文件: node1,node3 ...

  4. Apache htpasswd命令用法详解

    一. 基础 htpasswd建立和更新存储用户名.密码的文本文件, 用于对HTTP用户的basic认证. # /usr/local/apache/bin/htpasswd –help Usage: h ...

  5. 如何用Maven创建web项目(具体步骤)

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Creat ...

  6. winrar命令行加压解密

    加密的操作 Rar.exe a -P123 test1.rar test.txt 其中参数a表示添加文件或文件夹到压缩包中,-P参数表示是带密码的加密 Rar.exe e -P123 test1.ra ...

  7. svn没有对号等符号的问题

    文件夹--右键->TortoiseSVN->Settings  => 弹出一个对话框,在对话框中左边框中有一个Icon Overlays->Overlay Handlers   ...

  8. 交换机的link-dependency链路依赖功能

    在生产环境中,如果各主机连接到交换机的1-16端口,交换机的18端口上联到外部网络,如果此时交换机的18端口断掉,在主机端网卡仍然有连接,对于一些网络的配置可能就感知不到外部连接的消失,会有问题(如E ...

  9. 添加Properties取值和枚举取值

    <!--配置文件--><property name="ppp"> <props> <prop key="11"> ...

  10. 接微软技术(c#,.net,vb.net, asp.net, sql server, bi, dw etc)项目

    最近闲赋在家,接微软技术的项目,主要有c#,.net,vb.net, asp.net, sql server, bi, dw etc,欢迎推荐.不好意思,借首页发一下.