博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二十篇:类操作符重载的相关规定与具体实现示例
阅读量:5806 次
发布时间:2019-06-18

本文共 2716 字,大约阅读时间需要 9 分钟。

前言

       有书这么说过,C++设计的最大目的在于允许程序员定义自己的类型,并使它们用起来跟内置类型一样容易和直观。就目前看来,要实现这一点,最核心的莫过于操作符的重载。科学的重载可以让类的使用最大程度地接近内置类型。本文将讨论类操作符重载涉及到的一些原则和具体做法。

实现类操作符重载的两种思路

       1. 友元函数法: 将待重载操作符视作非成员函数( 它声明为操作数类型的友元函数 )

       应当采用这种机制重载的运算符有:IO操作符,算数操作符,关系操作符。

       2. 成员函数法: 将待重载操作符视作特殊的成员函数。

       应当采用这种机制重载的运算符有:赋值操作符,下标操作符,箭头操作符,自增自减操作符。

       对于其他的操作符,两种机制均可。至于为什么这么规定,请参阅相关C++教材,本文不详述。

示例一:输出操作符的重载( 友元函数法 )

1 #include 
2 #include
3 4 using namespace std; 5 6 /* 7 * 定义一个简单的书类 8 */ 9 class Book {10 public:11 // 将输出操作符函数设定为书类的友元函数12 friend ostream & operator<< (ostream & out,const Book &b );13 Book(string bookName, double price) {14 this->bookName = bookName;15 this->price = price;16 }17 string getName() const {18 return bookName;19 }20 double getPrice() const {21 return price;22 }23 private:24 string bookName;25 double price;26 };27 28 /*29 * 下为输出操作符重载函数30 * 对象设置为引用类型的目的仅仅是为了避免复制,故加上const声明。31 */32 ostream &33 operator<< (ostream & out, const Book &b) {34 out << "书名: " << b.getName() << " 价格: " << b.getPrice();35 36 return out;37 }38 39 int main()40 {41 Book book1("C++ Primer", 99.0);42 Book book2("编程珠矶", 39.0);43 44 /*45 * 像使用内置类型一样使用对象46 */47 cout << book1 << endl;48 cout << book2 << endl;49 50 return 0;51 }

       运行结果:

       

小结1

       1. 输出操作符的格式化操作应当尽量少

       2. 为什么说IO操作符重载不能够用成员函数法重载?请查阅C++相关教材。

示例二:赋值操作符的重载( 成员函数法 )

       接上例:

1 #include 
2 #include
3 4 using namespace std; 5 6 /* 7 * 定义一个简单的书类 8 */ 9 class Book {10 public:11 // 将输出操作符函数设定为书类的友元函数12 friend ostream & operator<< (ostream & out,const Book &b );13 /*14 * 下为输出操作符重载函数15 * 对象设置为引用类型的目的仅仅是为了避免复制,故加上const声明。16 */17 Book & operator= (const Book &b) {18 bookName = b.getName();19 price = b.getPrice();20 21 return *this;22 }23 Book(string bookName, double price) {24 this->bookName = bookName;25 this->price = price;26 }27 string getName() const {28 return bookName;29 }30 double getPrice() const {31 return price;32 }33 private:34 string bookName;35 double price;36 };37 38 /*39 * 下为输出操作符重载函数40 * 对象设置为引用类型的目的仅仅是为了避免复制,故加上const声明。41 */42 ostream &43 operator << (ostream & out, const Book &b) {44 out << "书名: " << b.getName() << " 价格: " << b.getPrice();45 46 return out;47 }48 49 int main()50 {51 Book book1("C++ Primer", 99.0);52 Book book2("编程珠矶", 39.0);53 54 /*55 * 像使用内置类型一样使用对象56 */57 cout << book1 << endl;58 cout << book2 << endl;59 60 // 将book2赋值给book1后输出61 book1 = book2;62 cout << book1 << endl;63 64 return 0;65 }

运行结果

       

转载地址:http://kwubx.baihongyu.com/

你可能感兴趣的文章
USNews大学排名遭美国计算机研究学会怒怼,指排名荒谬要求撤回
查看>>
struts1——静态ActionForm与动态ActionForm
查看>>
七大关键数据 移动安全迎来历史转折点
查看>>
各大电商纷纷瞄准机器人领域,备战双十一各显神功
查看>>
在AngularJS中学习javascript的new function意义及this作用域的生成过程
查看>>
盘点物联网网关现有联网技术及应用场景
查看>>
Windwos 08R2_DNS全面图文详解
查看>>
重拾黑客精神:后IT时代技术流的回归
查看>>
网络钓鱼大讲堂 Part3 | 网络钓鱼攻击向量介绍
查看>>
阿里云与Intel联合发布加密计算,亚洲首个云上“芯片级”数据保护
查看>>
关注数据中心NFV性能
查看>>
语音唤醒技术:small-footprint keyword spotting
查看>>
java关于时间的操作
查看>>
使用go chassis进行微服务路由管理
查看>>
Hello React Native
查看>>
Tesla辅助驾驶测试报告遭爆正确性有疑问
查看>>
Android精通之AsyncTask与ListView讲解
查看>>
Linux命令参数详细解析 curl
查看>>
Blockathon,挑战区块链开发,敢不敢来!
查看>>
Java中抽象类和接口有什么异同
查看>>