任何函数都能重载。

一、普通函数的重载

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. (转载)自动化基础普及之selenium是啥?

    转载:http://www.cnblogs.com/fnng/p/3980093.html Selenium 并不像QTP那样让人一下子就明白是什么?它是编程人员的最爱,但它却对测试新手产生了很大的阻 ...

  2. centos文件误删除恢复

    Centos 文件误删除 当意识到误删除文件后,切忌千万不要再频繁写入了,否则 你的数据恢复的数量将会很少. 而我们要做的是,第一时间把服务器上的服务全部停掉,直接killall 进程名 或者 kil ...

  3. python学习之——splinter使用

    开始学习使用splinter工具了,目前是摸索中,先熟悉splinter工具的使用方法~~ 实现功能: 打开firefox浏览器->www.baidu.com->输入关键词 python, ...

  4. SQL Server 列存储性能调优(翻译)

    原文地址:http://social.technet.microsoft.com/wiki/contents/articles/4995.sql-server-columnstore-performa ...

  5. c# long转 datetime

    ; DateTime start = , , , , , , DateTimeKind.Utc); DateTime date = start.AddMilliseconds(time).ToLoca ...

  6. POJ 3469 Dual Core CPU 最大流

    划分成两个集合使费用最小,可以转成最小割,既最大流. //#pragma comment(linker, "/STACK:1024000000,1024000000") #incl ...

  7. [python] 创建临时文件-tempfile模块

    This module generates temporary files and directories. It works on all supported platforms.In versio ...

  8. Java String,StringBuffer和StringBuilder的区别

    [可变与不可变] String是字符串常量,不可变. StringBuffer和StringBuilder是字符串变量,可变. [执行速度方面] StringBuilder > StringBu ...

  9. int main(int argc,char* argv[])详解

    argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数, 比如:       int   main(int   argc,   ...

  10. MG--滚动的视觉差效果

    #几句代码完成tableView滚动的视觉差 - 效果图 (失帧严重)![](http://upload-images.jianshu.io/upload_images/1429890-f2c8577 ...