C++的函数重载

1.所谓重载:
函数重载就是对已有的函数赋予新的含义,使之实现新的功能,因此同一个函数名就可以用来代替不同功能的函数。
2.声明、定义函数重载时如何解决命名冲突问题?
using就是一种解决命名冲突的方法
3 运算符重载实质上就是函数重载
重载运算符的的函数如下:
函数类型 operator 运算符名称(形参表)
{
对运算符的重载处理

}
例如:想对+用于complex的加法运算,函数的原型可以是这样:
complex operator+(complex &c1,complex &c2);
在上面的一般格式中operator是关键字,是专门运用于定义运算符重载函数的,函数名由operator和运算符组成operator+,两个形参是complex类对象的引用,要求实参是complex对象。
4.注重用户体验
有人可能会存在这样的疑虑,既然运算符重载和函数重载一样作用相同何必对运算符重载呢?
这里就要考虑到用户体验,从用户的角度来说虽然运算符重载所实现的功能完全可以由函数实现,但是使用运算符重载能使用户程序易于编写,和阅读维护
5.重载运算符的规则
不能重载的五个运算符:
(1).(成员访问运算符)
(2)*(指针访问运算符)
(3)::(域运算符)
(4)sizeof()(长度运算符)
(5)?:(条件运算符)
  前两个运算符不能重载是为了访问成员的功能不能改变,域运算符合sizeof运算符的运算对象时类型,而不是变量或者一般表达式,不具备重载的特征
  重载不能改变运算符运算对象的个数,不能改变运算符的优先级,不能改变运算符的结核性,重载运算符不能有默认参数
 6为什么运算符重载函数只有一个参数呢?
 实际上运算符重载函数应该有两个参数,but重载函数是complex类中的成员函数,因此有一个参数是隐含的,运算符函数是用this指针隐式访问对象中的成员,在这里举个例子吧
 complex operator+(complex &c2)
 可以看到operator+访问了两个对象成员,一个是形参对象中的成员this->real+c2.real,this->real就是 c1.real。
#include<iostream>
using namespace std;
class complex
{
public:
//定义构造函数
complex(int real=0,int image=0)
{
	_real=real;
	_image=image;
}

//1声明复数相加函数
complex operator+(complex &c2)
{
	 complex c;
	 c._real=_real+c2._real;
	 c._image=_image+c2._image;
	 return c;
}

//2声明+=函数
complex &operator+=(const complex &c)
{
	this->_real+=c._real;
	this->_image+=c._image;
	return *this;

}

//3声明前置++函数
complex &operator++()
{
this->_real++;
this->_image++;
return *this;
}

//4声明后置++函数
complex operator++(int)
{
	complex tmp(*this);
	this->_real++;
	this->_image++;
	return tmp;
}

//5声明-函数
complex operator-(complex &c2)
{
	complex c;
	c._real=_real-c2._real;
	c._image=_image-c2._image;
	return c;
}

//6声明*函数
complex operator*(complex &c2)
{
complex c;
c._real=_real*c2._real-_image*c2._image;
c._image=_image*c2._real+_real*c2._image;
return c;
}
//定义复数输出函数
void display()
{
	cout<<_real<<"+"<<_image<<"i"<<endl;
}
private:
	int _real;
	int _image;

};

int main()
{
	//test1
complex c1(3,4),c2(5,6),c3;//定义3个复数对象
c3=c1.operator+(c2);//调用复数相加函数
cout<<"c1=";
c1.display();
cout<<"c2=";
c2.display();
cout<<"c1+c2=";
c3.display();

//	//test2
//complex c1(3,4),c2(2,1);
//c1=c1.operator+=(c2);
//cout<<"c1=";
//c1.display();
//
//	//test3
//complex c1(1,2);
//c1=c1.operator++();
//cout<<"c1=";
//c1.display();
//	//test4
//complex c1(1,2);
//c1=c1.operator++();
//cout<<"c1=";
//c1.display();
//
//	//test5
//complex c1(3,4),c2(1,2),c3;
//c3=c1.operator-(c2);
//cout<<"c1-c2=";
//c3.display();
//
//	//test6
//complex c1(1,2),c2(2,3),c3;
//c3=c1.operator*(c2);
//cout<<"c1*c2=";
//c3.display();
system("pause");
return 0;
}
时间: 2024-10-19 05:34:20

C++的函数重载的相关文章

javascript 函数重载 overloading

函数重载 https://en.wikipedia.org/wiki/Function_overloading In some programming languages, function overloading or method overloading is the ability to create multiple methods of the same name with different implementations. Calls to an overloaded functi

day4 函数重载

函数的重载 1.函数重载的定义:在同一个类中,有一个以上的同名函数,只要函数的参数列表或参数类型不一样即可,与返回值无关, 这些统称为方法的重载. 2.函数的重载存在的原因:为了增强方法的阅读性,优化了程序设计. 案例1:九九乘法表 1 private static void print99() { 2 for(int i = 1 ; i<= 9 ; i ++){ 3 for(int j = 1 ; j<=i ; j++){ 4 System.out.print(i+"*"

c++中的函数重载

c++中的函数重载 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,这组函数被称为重载函数. 函数重载的作用 重载函数常用来实现功能类似而所处理的数据类型不同的问题,能减少函数名的数量,提高程序的可读性. 重载函数的构成说明 定义一个类,添加一系列函数名相同的函数,但参数形式各有不同,测试一下能否构成重载. #include <iostream> using names

C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern &quot;C&quot;声明

C++相对于C语言而言支持函数重载是其极大的一个特点,相信在使用C语言的时候大家如果要写一个实现两个整型数据相加的函数还要写一个浮点型数据相加的函数,那么这两个函数的名字绝对不可以一样,这样无疑在我们使用这个函数的时候增加了复杂性,但是在C++中我们却可以很好的解决这个问题,因为在C++中函数是支持重载的也就是说两个函数的函数名可以一样,这样并不会出现函数名重定义的问题,但是我们在使用的时候也要遵守一些规定,这些规定我们会在接下来的讨论中提到,下面我们就来分析在C++中函数是如何实现函数的重载的

C++ 函数重载与函数匹配

<C++ Primer>笔记,整理关于函数重载与函数匹配的笔记. 函数重载 void func(int a); //原函数 void func(double a); //正确:形参类型不同 void func(int a, int b); // 正确:形参个数不同 int func(int a); //错误:只有返回类型不同 typedef int int32; void func(int32 a); //与原函数等价:形参类型相同 void func(const int a); //与原函数

0607pm克隆&amp;引用类&amp;加载类&amp;面向对象串讲&amp;函数重载

克隆class Ren{ public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this->sex=$s; } function __clone()//改变克隆的对象内容 { $this->name="李思思";//this代表复本对象 $that->name="李思思";//that代表原本的,后来废弃了 }}$r=new Ren("张丹

函数重载、覆盖、多态

#include <iostream> using namespace std; /* *对于纯虚函数可以实现也可以不实现,但派生类一定要覆盖基类的纯虚函数.否则派生类仍然是抽象类 * *如果派生类覆盖基类的虚函数,则基类的指针或引用实际指向子类对象,那么通过该指针或引用调用虚函数时,将调用子类的虚函数;如果不是虚函数,则调用父类的函数. * */ class PEOPLE { public: int age; //派生类必须实现抽象类的纯虚函数,否则派生类仍然是抽象类 virtual voi

为什么C++支持函数重载

对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 假设某个函数的原型为: // 模块A头文件 moduleA.h #ifndef MODULE_A_H #define MODULE_A_H int foo( int x, int y ); #endif 该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类

C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针

 目  录 1       开始学习C++.............................................................................................................. 4 1.1       C++的头文件.................................................................................................

C++的函数重载和main函数之外的工作

今天被问到一个C++的函数重载问题,一下子没反应过来,这种基础的问题竟然忘记了,以下记录一下这些忘记的内容.     函数重载 函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载.注意函数重载不能基于不同的返回值类型进行重载. 注意函数重载中的"形参表"不同,是指本质不同,不要被一些表象迷惑.main函数不能被重载. 下面三组定义本质是相同的,不是重载: 1)int sum (int &a); 和 int sum (int &)