您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记 操作符重载一

2016-02-22 10:57 405 查看
运算符重载案例分析:

// 运算符重载课堂操练.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>

using namespace std;
class Complex{
public:
Complex(int a=0,int b=0){
this->a = a;
this->b = b;
}
void printComp(){
cout << "a+b*i=" << a << " + " << b << "i" << endl;
}
public:
int a;
int b;
};
//定义全局函数
Complex myAdd(Complex &c1, Complex &c2){
Complex tmp(c1.a+c2.a, c1.b+c2.b);
return tmp;
}
//对函数名 进行升级
Complex operator+(Complex &c1, Complex &c2){
Complex tmp(c1.a + c2.a, c1.b + c2.b);
return tmp;
}

int main()
{
int a = 0, b = 0, c;
c = a + b;//1 基础数据类型,编译器已经知道了如何运算
//a+bi 复数运算规则
Complex c1(1, 2), c2(3, 4);
Complex c3;//2 类也是一种数据类型 用户自定义数据类型 c++编译器 是不知道如何进行运算的
//3 C++编译器应该给我们程序员提供一种机制,让我们程序员有机会对自定义数据类型进行运算符操作。
//c3 = c1 + c2;
//4 运算符重载机制 技术推演流程
//步骤1 当我们不知道怎么做的时候 我们会写一个全局函数来进行加号运算
Complex c4=myAdd(c1, c2);
c4.printComp();
//步骤2 将函数名进行更改 就可以实现重载
Complex c5 = operator+(c1, c2);
c5.printComp();
//步骤3 但是这个显得不够高大上 于是就直接写成c1+c2 初步实现操作符重载
Complex c6 = c1 + c2;
c6.printComp();
//总结:1.运算符重载的本质是一个函数
return 0;
}


全局函数、类成员函数方法实现运算符重载步骤:

1)要承认操作符重载是一个函数,写出函数名称

2)根据操作数,写出函数参数

3)根据业务需要,完善函数返回值(看函数时返回引用,还是指针元素),及实现函数业务

运算符重载的两种方式:(二元运算符)
1)全局函数法 实现 +运算符重载(按照上面三个步骤)

Complex c1(1, 2), c2(3, 5);
Complex c3 = c1 + c2;
Complex operator+(Complex &c1, Complex &c2);


2)成员函数法 实现+运算符重载
//成员函数      Complex operator-(Complex &c2){
Complex tmp(this->a - c2.a, this->b - c2.b);
return tmp;
//调用时使用 c3=c1.operator-(c2); 也即c3=c1-c2;


一元运算符重载:

1)前置++操作符

a.用全局函数实现

friend Complex &operator++(Complex &c1);//返回本身,所以用引用

Complex& operator++(Complex &c1){

c1.a++;

c1.b++;

return c1;

}

b.用成员函数实现 前置--操作符

c1.operator--();// c1-- 调用方式

函数原型

Complex& operator--(){

this->a--;

this->b--;

return *this;//返回一个元素

}

2)后置++操作符

a.用全局函数实现

函数原型:

Complex operator++(Complex &c1,int){//为了避免和前置++重复,引进一个占位符

//先使用 再让c1++

Complex tmp=c1;

c1.a++;//使用了私有属性,要变成友元函数

c1.b++;

return tmp;

}

b.用成员函数的方法实现后置--操作符

c1--;//调用

那么函数原型为: c1.operator--();//有一个操作数被隐藏了

Complex operator--(int){//放在类的成员函数里

Complex tmp=*this;

this->a--;

this->b--;

return tmp;

}

3.友元函数重载 应用场景

运算符正规案例:

友元函数一般 用于重载<< >>操作符

友元函数没有this指针,所需操作数都必须在参数表显示声明,很容易实现类型的隐式转换。

友元函数不能用于函数重载的运算符有 : = () [] ->

#include "stdafx.h"
#include <iostream>

using namespace std;

class Complex{
public:
//friend void operator<<(ostream &out, Complex &c);
friend ostream &operator<<(ostream &out, Complex &c);
Complex(int _a,int _b){
a = _a;
b = _b;
}

private:
int a;
int b;
};

//void operator<<(ostream &out,Complex &c){
//	out << "12345 生活真是苦" << endl;
//	out << c.a << " + " << c.b << "i" << endl;
//}
ostream &operator<<(ostream &out, Complex &c){
out << "12345 生活真是苦" << endl;
out << c.a << " + " << c.b << "i" << endl;
return out;
}
int _tmain(int argc, _TCHAR* argv[])
{
Complex c1(1, 2), c2(3, 4);
cout << c1<<"111";//cout.operator<<(c1);左移运算符结合顺序是自左到右的 链式编程
//cout.operator<<(c1).operator<<("111");
//函数返回值当左值需要返回一个引用 return 0}
用类成员函数无法实现<<操作符重载 因为没有方法拿到cout这个类的源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: