C++学习之路——函数重载和运算符重载
大家好,又见面了,我是你们的朋友全栈君。
一、函数重载
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;
}
结果为:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170998.html原文链接:https://javaforall.cn
相关文章
- C++学习——继承与派生「建议收藏」
- C++学习之路—— C++异常处理机制
- C++学习——memset函数详解
- EasyC++13,结构体初探
- C/C++编程学习 – 第5周 ④ 石头剪刀布「建议收藏」
- C++数组搜索(二分法)
- C++结构体和类的区别_c++有结构体吗
- C++ 新特性学习(一) -- 概述+智能指针(smart_ptr)
- 准大三学生给想学习C++同学的学习路线
- fscanf读取一行字符串-C++的学习之路---12
- c++stl
- 【C++ 语言】Visual Studio 配置 POSIX 线程 ( Windows 不支持 POSIX | 配置文件下载 | 库文件说明 | 配置过程 )
- C++类和对象(中)
- C++:string实现查找网址的协议名和后缀
- C++ 测试框架 GoogleTest 初学者入门篇 乙
- C++面向对象程序设计(谭浩强)第三章第10~11节学习笔记
- c++基础篇之C++ 模板
- C++ auto(类型推导)精讲
- C++学习之旅三我和超级玛丽有个约会
- c++成员函数与非成员函数的抉择
- C++中汉字字符串的截取
- C++初始化列表学习
- 关于C++中的static关键字的总结