1,下面的复数解决方案是否可行?

1,代码示例:

 class Comples
{
public:
int a;
int b;
}; int main()
{
Complex c1 = {, };
Complex c2 = {, };
Complex c3 = c1 + c2; // error: no match for 'operator' in 'c1 + c2' return ;
}

2,重载最深层次的意义在于通过重载可以扩展系统已有的功能;

3,成员变量为公有且没有自定义构造函数的时候,可以通过大括号来分别初始     化成员变量;

2,复数的加法操作编程实验:

1,main.cpp 文件:

 #include <stdio.h>

 class Complex
{
int a;
int b;
public:
Complex(int a = , int b = )
{
this->a = a;
this->b = b;
} int getA()
{
return a;
} int getB()
{
return b;
} friend Complex Add(const Complex& p1, const Complex& p2);
}; Complex Add(const Complex& p1, const Complex& p2)
{
Complex ret; ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b; return ret;
} int main()
{ Complex c1(, );
Complex c2(, );
Complex c3 = Add(c1, c2); // c1 + c2 printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); return ;
}

2,输出结果:

  c3.a = 4,  c3.b = 6

3,思考:

1,Add 函数可以解决 Complex 对象相加的问题,但是 Complex 是现实世界中确切存在的复数,并且复数在数学中的地位和普通的实数相同;

2,为什么不能让 + 操作符也支持复数相加呢?

1,因为复数是我们自定义的类,编译器不知道这个类;

2,C++ 中扩展已有的功能可以通过重载来实现;

4,操作符重载:

1,C++ 中的重载能够扩展操作符的功能;

2,操作符的重载以函数的方式进行;

3,本质:

1,用特殊形式的函数扩展操作符的功能;

4,通过 operator 关键字可以定义特殊形式的函数;

5,operator 的本质是通过函数重载操作符;

6,语法:

1,代码示例:

 Type operator Sign(const Type& p1, const Type& p2) // operator 关键字作为特殊形式函数的前缀,它直接告诉编译器,如果有两个 Type 对象做 Sign 运算,则直接调用本函数;
{
Type ret; return ret;
}

2,Sign 为系统中预定义的操作符,如:+,-,*,/等;

3,仅在定义时函数名特殊,调用时和普通函数相同;

5,操作符重载初探编程实验:

1,main.cpp 文件:

 #include <stdio.h>

 class Complex
{
int a;
int b;
public:
Complex(int a = , int b = )
{
this->a = a;
this->b = b;
} int getA()
{
return a;
} int getB()
{
return b;
} friend Complex operator + (const Complex& p1, const Complex& p2);
}; Complex operator + (const Complex& p1, const Complex& p2)
{
Complex ret; ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b; return ret;
} int main()
{ Complex c1(, );
Complex c2(, );
Complex c3 = c1 + c2; // c1 + c2 ==> operator + (c1, c2);用 “+” 来操作两个类,编译器没能力,然后编译器查找有没有用重载的概念扩展操作符的功能,于是找到了 operator +() 这个函数,如果编译器成功匹配相应的参数,则成功调用 operator +() 函数; printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); return ;
}

 2,输出结果:

  1,c3.a = 4, c3.b = 6

 3,问题:

  1,这里的解决方案用了友元,现代软件开发不允许;

  2,是否可以提供成员函数代替全局函数,以抛弃友元?

6,可以将操作符重载函数定义为类的成员函数:

1,比全局操作符重载函数少一个参数(左操作数);

1,和全局函数最大的差异;

2,成员函数中隐藏的 this 参数可以充当左操作数的角色;

2,不需要依赖友元就可以完成操作符重载;

3,编译器优先在成员函数中寻找操作符重载函数;

1,一旦在成员函数中找到,就不会去全局找;

4,代码示例:

 class Type
{
public:
Type operator Sign(const Type& p) // 左操作数用 this;
{
Type ret; return ret;
}
};

7,成员函数重载操作符编程实验:

1,main.cpp 文件:

 #include <stdio.h>

 class Complex
{
int a;
int b;
public:
Complex(int a = , int b = )
{
this->a = a;
this->b = b;
} int getA()
{
return a;
} int getB()
{
return b;
} Complex operator + (const Complex& p)
{
Complex ret;
printf("Complex operator + (const Complex& p)\n");
ret.a = this->a + p.a;
ret.b = this->b + p.b; return ret;
} friend Complex operator + (const Complex& p1, const Complex& p2);
}; Complex operator + (const Complex& p1, const Complex& p2)
{
Complex ret;
printf("Complex operator + (const Complex& p1, const Complex& p2)\n");
ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b; return ret;
} int main()
{ Complex c1(, );
Complex c2(, );
Complex c3 = c1 + c2; // c1 + c2 ==> c1.operator + (c2) printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); return ;
}

 2,输出结果:

  Complex operator + (const Complex& p)

  c3.a = 4, c3.b = 6

8,小结:

1,操作符重载是 C++ 的强大特性之一;

2,操作符重载的本质是通过函数扩展操作符的功能;

3,operator 关键字是实现操作符重载的关键;

4,操作符重载遵循相同的函数重载规则;

5,全局函数和成员函数都可以实现对操作符的重载;

C++中操作符重载的概念的更多相关文章

  1. 关于C++中操作符重载的疑问 :四个运算符=, -&gt;, [], ()不可以重载为全局函数(友员函数)

    转载自:http://blog.csdn.net/u014610226/article/details/47679323     以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需 ...

  2. C++基础学习笔记----第十三课(操作符重载-下)

    本节主要讲使用成员函数重载操作符,包括[],=,(),->四种操作符的重载以及&&和||的问题. 类的成员函数进行操作符重载 基本概念 类的成员函数也可以进行操作符的重载.类的普 ...

  3. C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载

    1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; c ...

  4. C++中采用操作符重载完善复数类

    1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...

  5. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  6. C++中的操作符重载

    一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...

  7. delphi 中record 的类操作符重载简介

    今天简单介绍一下 delphi 中record 的类操作符重载使用,就是如何 实现 record 之间的简单操作. 关于类操作符重载 ,大家可以看官方的文档. Delphi allows certai ...

  8. Python中的操作符重载

    运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果.     类可以重载python的操作符 操作符重载使我们的对 ...

  9. 【C++】C++中的操作符重载

    C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下. ...

随机推荐

  1. VMware安装Ghost版Win10 失败的解决方法

    第一个失败点,是分区之后,重启,提示alt+ctrl+del要求重启,然后就是无限提示,解决方案:在重启读条的时候,按Esc,或者F2调整系统启动优先级读取位置,设置为CD的那个,就可以进入到安装系统 ...

  2. 使用net命令启动MongoDB服务发生系统错误,返回值为5

    使用net命令启动MongoDB服务发生系统错误,返回值为5 错误的截图如下: 解决的方案是以管理员的身份运行命令窗口,参考如下: https://www.cnblogs.com/fanblogs/p ...

  3. 爬虫之Handler处理器和自定义Opener

    一.Handler处理器和自定义Opener opener是 request.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构 ...

  4. 3D Computer Grapihcs Using OpenGL - 18 相机移动

    移动相机需要用到键盘按键,按键事件的引入需要包含头文件 #include <Qt3DInput\qkeyevent.h> 并实现QWidget中定义的虚函数keyPressEvent 我们 ...

  5. HDU2179--pi(麦金公式)

    Problem Description 计算圆周率到小数点后5n 位.(本题不可打表) Input 正整数n<300. n=0结束. Output 圆周率pi到小数点后5n位.第1行输出3.以5 ...

  6. Spring Data JPA(一)简介

    Spring Data JPA介绍 可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL(Java Persistence Query Language) ...

  7. [CSP-S模拟测试]:最小距离(最短路)

    题目传送门(内部题97) 输入格式 第一行三个整数$n,m,p$,第二行$p$个整数$x_1\sim x_p$表示特殊点的编号.接下来$m$行每行三个整数$u,v,w$表示一条连接$u$和$v$,长度 ...

  8. [LeetCode]-algorithms-Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  9. 使用注解装配Bean

    注解@Component代表Spring Ioc 会把 这个类扫描生产Bean 实例,而其中 value属性代表这个类在Spring 中的id,这就相当于XML方式定义的Bean  的 id 现在有了 ...

  10. @清晰掉 sprintf sscanf双胞胎

    sprintf() 格式化输出函数(图形) 功能: 函数sprintf()用来作格式化的输出.用法: 此函数调用方式为int sprintf(char *string,char *format,arg ...