C++学习笔记 操作符重载一
2016-02-22 10:57
405 查看
运算符重载案例分析:
全局函数、类成员函数方法实现运算符重载步骤:
1)要承认操作符重载是一个函数,写出函数名称
2)根据操作数,写出函数参数
3)根据业务需要,完善函数返回值(看函数时返回引用,还是指针元素),及实现函数业务
运算符重载的两种方式:(二元运算符)
1)全局函数法 实现 +运算符重载(按照上面三个步骤)
2)成员函数法 实现+运算符重载
一元运算符重载:
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指针,所需操作数都必须在参数表显示声明,很容易实现类型的隐式转换。
友元函数不能用于函数重载的运算符有 : = () [] ->
// 运算符重载课堂操练.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这个类的源码
相关文章推荐
- C++学习之模板篇(类模板)
- C++学习笔记(十二):重载函数
- 如何利用开发开具调试程序-VC++6.0篇
- C语言的预处理
- c语言中的结构体
- C++ | boost库 类的序列化
- C++ and C Combination Compile Extern
- C语言内存管理
- C++基础::cin/cout
- VS2010 C++环境下DLL和LIB文件目录及名称修改
- VC++ 屏蔽按ENTER或者ESC键退出程序
- C++构造函数详解及显式调用构造函数
- 利用C语言强行点击置灰的按钮
- c/c++ 面试积累
- C++高精度运算类bign (重载操作符)
- C语言(函数指针)
- C++学习笔记:友元函数和友元类
- 利用for语句 + switch语句进行中奖判断和循环
- 关于c++primer的一个代码错误
- 利用while语句 + if语句输出1~100能被3整除的数字