C++学习之路——函数重载和运算符重载

C++学习之路——函数重载和运算符重载一、函数重载C++允许在同一作用域中的某个函数和运算符指定多个定义,分 别称为函数重载和运算符重载重载声明是指一个与之前已经在该作用域内声明过的函数或方法 具有相同名称的声明,但是它们的参数列表和实现不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。C++中的函数重…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、函数重载

C++允许在同一作用域中的某个函数和运算符指定多个定义,分 别称为函数重载和运算符重载

重载声明是指一个与之前已经在该作用域内声明过的函数或方法 具有相同名称的声明,但是它们的参数列表和实现不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。
C++中的函数重载

在同一个作用域内,可以声明几个功能类似的同名函数,但是这 些同名 函数的形式参数(指参数的个数、类型或者顺序)必须不同。 您不能仅通过返回类型的不同来重载函数。
下面的实例中,同名函数 print() 被用于输出不同的数据类型:

二、运算符重载

重载的运算符是带有特殊名称的函数,函数名是由关键字 oper ator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算 符有一个返回类型和一个参数列表。
Box operator + (const Box &);

声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象。 大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成 员函数。如果我们定义上面的函数为类的非成员函数,那么我们需要 为每次操作传递两个参数,如下所示:
Box operator+(const Box&, const Box&);

可重载运算符/不可重载运算符

在这里插入图片描述

在这里插入图片描述

例题:

用一个程序实现课程中讲过之外的三种运算符重载,其中new/delete为必选项,其他两个任选。

在这里插入图片描述
代码如下:

//new delete的重载
class A { 
   
	int i;
	int j;
public:
	A() { 
    cout << "A()" << endl; }

	void *operator new(size_t size)
	{ 
   
		void *p;
		p = (void *)malloc(size);
		cout << "为对象申请字节空间为" << size << endl;
		return p;
	}
	void operator delete(void *p)
	{ 
   
		cout << "删除申请的字节空间" << endl;
		free(p);
	}


	void *operator new[](size_t size)
	{ 
   
		void *p;
		p = (void*)malloc(size);
		cout<< "为对象申请的内存单元个数" << size << endl;
		return p;
	}


		void operator delete[](void *p)
	{ 
   
		cout << "删除为申请的内存单元个数" << endl;
		free(p);
	}
};

class B
{ 
   
public:
	double a;
	B(double x)
	{ 
   
		a = x;
	}
	double operator /(B m);

};
double B::operator /(B m)
{ 
   
	double x1;
	x1 = a / m.a;
	return x1;
}

//class C
//{ 
   
//public:
// string ss;
// C(string s)
// {ss = s;}
// C &operator =(const C &);
//private:
// char *p1;
//};
//
//C &C::operator =(const C &m)
//{ 
   
// if (this==&m)
// { 
   
// return *this; //防止s=s的赋值
// }
// char *p2;
// p2 = new char[strlen(m.p1) + 1];//分配新区域 
// strcpy(p2, m.p1); //字符串复制
// delete p1;
// return *this;
//}

class D
{ 
   
public:
	double a;
	D(double x)
	{ 
   
		a = x;
	}
	double operator *(D m);

};
double D::operator *(D m)
{ 
   
	double x1;
	x1 = a * m.a;
	return x1;
}

int main()
{ 
   
	cout << "************************" << endl;
	cout << "new delete的重载" << endl;
	A *a = new A;
	delete(a);
	A *a1 = new A[10];
	delete[] a1;

	cout << "************************"<< endl;
	cout << "/的重载" << endl;
	B b1(2.6);
	B b2(3.6);
	double b3;
	b3 = b1 / b2;
	cout << "b3的值为" << b3 << endl;

	//cout << "************************" << endl;
	//cout << "=的重载" << endl;
	//C c1("边牛牛");
	//C c2("真牛");
	//c2 = c1;

	cout << "************************" << endl;
	cout << "*的重载" << endl;
	D d1(2.6);
	D d2(9.6);
	double d3;
	d3 = d1 * d2;
	cout << "d3的值为" << d3 << endl;
	return 0;
}


结果为:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170998.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号