C++中的运算符重载(一)
2013-12-29 16:11
204 查看
.1.运算符重载的定义及实例
C++ 中的多态性分为动态多态性和静态多态性,前者由虚函数实现,后者由函数重载和运算符重载实现。静态多态性的优点是函数调用速度快、效率高,缺点是编程不够灵活。
运算符重载是对已经有的运算符赋予多重含义,同一个运算符作用于不同类型的数据将产生不同的行为。C++中的运算符只能是基本数据类型,很多用户自定义的行为需要用运算符重载实现,运算符重载扩充了C++语言本身的功能。
下面是运算符重载的一个例子,+可以完成两个int型数据加法,或者两个double类型的数据加法,如果要完成两个类对象的相加,需要使用重载。例子中定义了复数类并实现相加的功能。
2.C++可以重载的运算符
C++不可以重载的运算符有:
:: . .* ?:
(1) 重载的运算符的优先级和结合性都不会改变运算符重载的规则如下:
(2) 运算符重载是对原有运算符的适当改造,一般地,重载的功能与原来的功能类似
(3) 运算符重载不能改变原运算符的操作对象个数,同时至少有一个操作数是自定义类型。
3.运算符重载的方式
运算符重载分为成员函数重载和友元函数重载两种。这里先介绍成员函数重载的方式,它的格式为:
<函数类型> operator <运算符>(<形式参数>)
{
···//<函数体>
}
运算符重载时,用operator作关键字,重载单目运算符时,形式参数表为空,调用单目运算符的当前对象是唯一的操作数,重载双目运算符时,形参表指定第二个操作数,第一个操作数即为调用运算符的对象本身。在上面介绍的例子中,重载+实现两个复数的相加,应该有两个操作数,但是由于使用了成员重载,形式参数表中只需要一个参数。
运算符的友元重载形式为:
friend <函数类型> operator <运算符>(<形式参数>)
{
··· // <函数体>
}
从形式上看,友元重载单目运算符时,形式参数表为一个操作数,重载双目运算符时,形式参数表为两个参数,这一点与成员重载的方式不同。
上面的介绍了成员函数和友元函数重载运算符,什么时候用成员函数的形式重载运算符,什么时候用友元函数的形式重载运算符?这里有一些经验规则:
(1) = [] () ->必须用成员函数的形式重载
(2) 复合赋值运算符通常定义为类的成员
(3) 改变对象状态或与给行类型紧密联系的运算符,如自增、自减、解引用通常定义为类成员
(4) 对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为友元函数
C++ 中的多态性分为动态多态性和静态多态性,前者由虚函数实现,后者由函数重载和运算符重载实现。静态多态性的优点是函数调用速度快、效率高,缺点是编程不够灵活。
运算符重载是对已经有的运算符赋予多重含义,同一个运算符作用于不同类型的数据将产生不同的行为。C++中的运算符只能是基本数据类型,很多用户自定义的行为需要用运算符重载实现,运算符重载扩充了C++语言本身的功能。
下面是运算符重载的一个例子,+可以完成两个int型数据加法,或者两个double类型的数据加法,如果要完成两个类对象的相加,需要使用重载。例子中定义了复数类并实现相加的功能。
2.C++可以重载的运算符
+ | - | * | / | % | ^ |
& | | | ~ | ! | , | = |
< | > | <= | >= | ++ | -- |
<< | >> | == | != | && | || |
+= | -= | /= | %= | ^= | &= |
|= | *= | <<= | >>= | [] | () |
-> | ->* | new | new[] | Delete | delete[] |
:: . .* ?:
(1) 重载的运算符的优先级和结合性都不会改变运算符重载的规则如下:
(2) 运算符重载是对原有运算符的适当改造,一般地,重载的功能与原来的功能类似
(3) 运算符重载不能改变原运算符的操作对象个数,同时至少有一个操作数是自定义类型。
3.运算符重载的方式
运算符重载分为成员函数重载和友元函数重载两种。这里先介绍成员函数重载的方式,它的格式为:
<函数类型> operator <运算符>(<形式参数>)
{
···//<函数体>
}
运算符重载时,用operator作关键字,重载单目运算符时,形式参数表为空,调用单目运算符的当前对象是唯一的操作数,重载双目运算符时,形参表指定第二个操作数,第一个操作数即为调用运算符的对象本身。在上面介绍的例子中,重载+实现两个复数的相加,应该有两个操作数,但是由于使用了成员重载,形式参数表中只需要一个参数。
# include <iostream> using namespace std; class Complex { public: Complex(int i,int j):x(i),y(j){} Complex & operator+(Complex &); void print(); private: int x; int y; }; Complex & Complex::operator+(Complex & a) { x+=a.x; y+=a.y; return *this; } void Complex::print() { cout<<x<<"+"<<y<<"i"<<endl; } int main() { Complex t1(1,3); Complex t2(2,4); Complex t3=t1+t2; // t3.print(); cin.get(); return 0; }
运算符的友元重载形式为:
friend <函数类型> operator <运算符>(<形式参数>)
{
··· // <函数体>
}
从形式上看,友元重载单目运算符时,形式参数表为一个操作数,重载双目运算符时,形式参数表为两个参数,这一点与成员重载的方式不同。
# include <iostream> using namespace std; class Complex { public: Complex(){} Complex (int i,int j):x(i),y(j){} void print(); friend Complex & operator+(Complex &a,Complex &b); private: int x; int y; }; Complex & operator +(Complex &a,Complex &b) { Complex c; c.x=a.x+b.x; c.y=a.y+b.y; return c; } void Complex::print() { cout<<x<<"+"<<y<<"i"<<endl; } int main() { Complex t1(1,2); Complex t2(2,3); Complex t3=t1+t2; t3.print(); cin.get(); return 0; }
上面的介绍了成员函数和友元函数重载运算符,什么时候用成员函数的形式重载运算符,什么时候用友元函数的形式重载运算符?这里有一些经验规则:
(1) = [] () ->必须用成员函数的形式重载
(2) 复合赋值运算符通常定义为类的成员
(3) 改变对象状态或与给行类型紧密联系的运算符,如自增、自减、解引用通常定义为类成员
(4) 对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为友元函数
相关文章推荐
- c++学习之--关于运算符重载
- 【c++】类和对象--四个默认成员函数+运算符重载
- c++ 构造函数重定义 + 运算符重载、流重载
- C++学习之路—运算符重载(一)概念、方法及规则
- C++ 运算符重载一(二元运算符重载)
- C++实验题---填空(运算符重载)
- C++_运算符重载 总结
- C++之运算符重载一:简单理解运算符重载
- C++重载输入输出运算符重载在VC6.0中通不过编译
- C++技术点积累(3)——对象初始化列表、运算符重载
- c++中的运算符重载
- c++ 运算符重载 友元函数
- C++学习历程(三)运算符重载
- C++实践参考——Time类中的运算符重载
- C++ 运算符重载
- C++ 运算符重载 一个运算符赋予新的含义
- C++学习笔记十四-运算符重载
- c++学习-运算符重载
- C++【面试题】:类实现万年历(日期计算器),(含构造函数、拷贝构造、运算符重载、析构函数)
- C++_运算符重载