企查查网站,什么做网站统计好,衡水做网站推广,南川网站建设公司1、概念
所谓重载#xff0c;就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义#xff0c;使之实现新功能#xff0c;因此#xff0c;一个函数名就可以用来代表不同功能的函数#xff0c;也就是”一名多用”。
运算符也可以重载。实际上#xff0c;我们…1、概念
所谓重载就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义使之实现新功能因此一个函数名就可以用来代表不同功能的函数也就是”一名多用”。
运算符也可以重载。实际上我们已经在不知不觉之中使用了运算符重载。例如大 家都已习惯于用加法运算符””对整数、单精度数和双精度数进行加法运算如58 5.8 3.67等其实计算机对整数、单精度数和双精度数的加法操作过程是很不相同的 但由于C已经对运算符””进行了重载所以就能适用于int, float, doUble类型的运算。
又如”“是C的位运算中的位移运算符左移但在输出操作中又是与流对 象cout 配合使用的流插入运算符”“也是位移运算符(右移但在输入操作中又是与流对象 cin 配合使用的流提取运算符。这就是运算符重载(operator overloading)。C系统对”“和”“进行了重载用户在不同的场合下使用它们时作用是不同 的。对”“和”“的重载处理是放在头文件stream中的。因此如果要在程序中用” “和””作流插入运算符和流提取运算符必须在本文件模块中包含头文件stream(当然还应当包括”using namespace std“)。 现在要讨论的问题是用户能否根据自己的需要对C已提供的运算符进行重载赋予它们新的含义使之一名多用。
运算符重载入门技术推演 为什么会用运算符重载机制 用复数类举例
Complex c3 c1 c2;
原因 Complex是用户自定义类型编译器根本不知道如何进行加减.因此编译器给提供了一种机制让用户自己去完成自定义类型的加减操作。这个机制就是运算符重载机制
运算符重载的本质是一个函数
#include stdio.h// a bi
class Complex
{friend Complex add (Complex a, Complex b);friend Complex operator (Complex a, Complex b);
public:Complex(){m_a 0;m_b 0;}Complex (int a, int b){m_a a;m_b b;}void print (){printf (%d %di\n, m_a, m_b);}Complex operator- (Complex b){Complex tmp(m_a-b.m_a, m_b-b.m_b);return tmp;}private:int m_a;int m_b;
};// 全局函数
Complex add (Complex a, Complex b)
{Complex tmp(a.m_ab.m_a, a.m_bb.m_b);return tmp;
}// 运算符重载: 本质是一个函数
// 函数名字组成operator 要重载的运算符
Complex operator (Complex a, Complex b)
{Complex tmp(a.m_ab.m_a, a.m_bb.m_b);return tmp;
}// 运算符重载给运算符重新定义功能
// 1、写函数名operator 重载的运算符
// 2、根据运算需求 写函数的 参数列表
// 3、根据需求 写出函数返回值的类型
int main()
{Complex c1(1,2), c2(3,4), c3, c4;c1.print();c2.print();// c3 c1 c2; // Complex 自定义的类编译器不知道以什么规则进行运算// c3 add(c1, c2);// c3 operator(c1, c2);c3 c1 c2; // operator(c1, c2);c3.print();// c4 c3.operator-(c2); // c3 - c2c4 c3 - c2; // c4 c3.operator-(c2)/operator-(c1, c2);// ( operator(c1, c3) ).operator-(c2)c4 c1 c3 - c2;c4.print();return 0;
}int mai3_1()
{int a 10, b 20, c;c a b; // 基础的数据做运算编译器直到怎么做printf (c %d\n, c);return 0;
}
2、限制 3、基础 例如
//全局函数 完成 操作符 重载
Complex operator(Complex c1, Complex c2)
//类成员函数 完成 -操作符 重载
Complex operator-(Complex c2)
运算符重载的两种方法
例如1:通过类成员函数完成-操作符重载
//函数声明 Complex operator-(Complex c2)
//函数调用分析
//用类成员函数实现-运算符重载Complex c4 c1 - c2;c4.printCom();//c1.operator-(c2);
例如2:通过全局函数方法完成操作符重载
//函数声明 Complex operator(Complex c1, Complex c2)
//函数调用分析
int main()
{Complex c1(1, 2), c2(3, 4);//Complex c31 operator(c1, c2);
Complex c3 c1 c2;
c3.printCom();
} 例如3
//前置操作符 用全局函数实现
Complex operator(Complex c1)
{c1.a ; c1.b ;return c1;
}
//调用方法
c1 ; //需要写出操作符重载函数原形
c1.printCom();//运算符重载函数名定义
//首先承认操作符重载是一个函数 定义函数名operator
//分析函数参数 根据左右操作数的个数,operator(Complex c1)
//分析函数返回值Complex operator(Complex c1) 返回它自身
例如4
//4.1前置--操作符 成员函数实现
Complex operator--()
{this-a--;this-b--;return *this;
}//4.2调用方法
--c1;
c1.printCom();
//4.3前置—运算符重载函数名定义
//c1.operator–()
例如5
//5.1 //后置 操作符 用全局函数实现
Complex operator(Complex c1, int)
{Complex tmp c1;c1.a;c1.b;return tmp;
}//5.2 调用方法
c1 ; //先使用 后
//5.3 后置运算符重载函数名定义
Complex operator(Complex c1, int)
函数占位参数 和 前置 相区别
例如6
//6.1 后置— 操作符 用类成员函数实现
Complex operator--(int)
{Complex tmp *this;this-a--;this-b--;return tmp;
}//6.2 调用方法
c1 ; //先使用 后
//6.3 后置–运算符重载函数名定义
Complex operator--(int) //函数占位参数 和 前置– 相区别
前置和后置运算符总结 C中通过一个占位参数来区分前置运算和后置运算
#include iostream
using namespace std;class Complex
{
private:int a;int b;//全局函数 重载运算符friend Complex operator(Complex c1, Complex c2);//重载 前置friend Complex operator(Complex c1);friend Complex operator(Complex c1, int);
public:Complex(int a0, int b0){this-a a;this-b b;}void printCom(){couta b i endl;}
public://成员函数法 实现 -运算符重载Complex operator-(Complex c2){Complex tmp(this-a - c2.a, this-b - c2.b);return tmp;}//前置--Complex operator--(){this-a --;this-b --;return *this;}//后置--Complex operator--(int){Complex tmp *this;this-a--;this-b--;return tmp;}
};//全局函数法 实现 运算符重载
Complex operator(Complex c1, Complex c2)
{Complex tmp(c1.a c2.a, c1.b c2.b);return tmp;
}//前置
Complex operator(Complex c1)
{c1.a;c1.b;return c1;
}//后置
Complex operator(Complex c1, int)
{//先使用 在让c1加加Complex tmp c1;//return c1;c1.a ;c1.b ;return tmp;
}/*
全局函数、类成员函数方法实现运算符重载步骤1要承认操作符重载是一个函数写出函数名称2根据操作数写出函数参数 3根据业务完善函数返回值(看函数是返回引用 还是指针 元素)及实现函数业务
*/
void main()
{Complex c1(1, 2), c2(3, 4);//1 全局函数法 实现 运算符重载// Complex operator(Complex c1, Complex c2);Complex c3 c1 c2;c3.printCom();//2 成员函数 法 实现 -运算符重载//c1.operator-(c2);//Complex operator-(Complex c2)Complex c4 c1 - c2;c4.printCom();//前置操作符 用全局函数实现c1;c1.printCom();//前置--操作符 成员函数方法--c1;c1.printCom();//Complex operator(Complex c1)//c1.operator--();//后置操作符 用全局函数实现c1;c1.printCom();//后置--操作符 用成员函数实现c1--;c1.printCom();//c1.operator--()couthello...endl;system(pause);return ;
}
友元函数实现操作符重载的应用场景 1 友元函数和成员函数选择方法
当无法修改左操作数的类时使用全局函数进行重载, [], ()和-操作符只能通过成员函数进行重载 2用友元函数重载 操作符istream 和 ostream 是 C 的预定义流类cin 是 istream 的对象cout 是 ostream 的对象运算符 由ostream 重载为插入操作用于输出基本类型数据运算符 由 istream 重载为提取操作用于输入基本类型数据用友员函数重载 和 输出和输入用户自定义的数据类型
a用全局函数方法实现操作符重载
ostream operator(ostream out, Complex c1)
{//out12345生活真是苦endl;outc1.a c1.bi endl;return out;
}/调用方法
coutc1;
//链式编程支持
coutc1abcc;
//cout.operator(c1).operator(abcd);
/函数返回值充当左值 需要返回一个引用
b类成员函数方法实现操作符重载
因无法拿到cout这个类的源码cout.operator(c1);
友元函数重载操作符使用注意点 a友元函数重载运算符常用于运算符的左右操作数类型不同的情况 b其他
在第一个参数需要隐式转换的情形下使用友员函数重载运算符是正确的选择友员函数没有 this 指针所需操作数都必须在参数表显式声明很容易实现类型的隐式转换C中不能用友员函数重载的运算符有
友元函数案例vector类
#include iostream
using namespace std;//为vector类重载流插入运算符和提取运算符
class vector
{
public :vector( int size 1 ) ; ~vector() ;int operator[]( int i ) ;friend ostream operator ( ostream output , vector ) ;friend istream operator ( istream input, vector ) ;
private : int * v ; int len ;
};vector::vector( int size )
{ if (size 0 || size 100 ){ cout The size of size is null !\n ; abort() ; }v new int[ size ] ; len size ;
}vector :: ~vector()
{ delete[] v ; len 0 ;
}int vector::operator[]( int i )
{ if( i 0 i len ) return v[ i ] ;cout The subscript i is outside !\n ; abort() ;
}
ostream operator ( ostream output, vector ary )
{ for(int i 0 ; i ary.len ; i ) output ary[ i ] ;output endl ;return output ;
}
istream operator ( istream input, vector ary )
{ for( int i 0 ; i ary.len ; i ) input ary[ i ] ;return input ;
}void main()
{ int k ;cout Input the length of vector A :\n ; cin k ;vector A( k ) ;cout Input the elements of vector A :\n ; cin A ;cout Output the elements of vector A :\n ;cout A ;system(pause);
}