C++重载IO操作符

操作符的重载有一定的规则,而IO操作符必须重载为普通函数,且应该声明为类的友元函数。我试了,非友元也可以,但是必须提供访问成员变量的函数,所以,出于效率的考虑还是应该定义为友元。

规则如下:

1.  重载操作符必须具有一个类类型或枚举类型操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。

如: int operator+(int, int), 不可以

2.  为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数。在某些情况下,程序没有选择,操作符必须是成员;在另外一些情况下,有些经验可以指导我们做出决定。下面是一些指导:

a. 赋值(=),下标([]),调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。

b. 像赋值一样,复合赋值操作符通常应定义为类的成员。与赋值不同的是,不一定非得这样做,如果定义为非成员复合赋值操作符,不会出现编译错误。

c. 改变对象状态或与给定类型紧密联系的其他一些操作符,如自增,自减和解引用,通常应定义为类成员。

d 对称的操作符,如算术操作符,相等操作符,关系操作符和位操作符,最好定义为普通非成员函数。

e io操作符必须定义为非成员函数,重载为类的友元。

 1 #include <iostream>
 2 using namespace std;
 3
 4 class Test
 5 {
 6 public:
 7     Test()
 8     {
 9         x = 0;
10         y = 0;
11     }
12     Test(int x, int y)
13     {
14         this->x = x;
15         this->y = y;
16     }
17     void setX(const int x)
18     {
19         this->x = x;
20     }
21     int getX() const
22     {
23         return x;
24     }
25
26     void setY(const int y)
27     {
28         this->y = y;
29     }
30     int getY() const
31     {
32         return y;
33     }
34 private:
35     int x, y;
36 };
37
38 ostream &operator <<(ostream &out, const Test &t)
39 {
40     out << t.getX() << t.getY();
41     return out;
42 }
43 istream &operator >>(istream &in, Test &t)
44 {
45     int x = 0, y = 0;
46     in >> x >> y;
47     t = Test(x, y);
48     return in;
49 }
50
51 int main(void)
52 {
53     Test t(4, 5);
54     cout << t << endl;
55
56     cin >> t;
57     cout << t << endl;
58
59     return 0;
60 }

在主函数中简单的测试了一下。成功写入并读取。

C++重载IO操作符

时间: 2024-11-04 03:44:31

C++重载IO操作符的相关文章

C++中重载输入输出操作符

QT中封装了数据流类QDataStream和模板类QList.有时需要往流里写模板类对象,但是,QDataStream中,没有参数匹配的运算符重载函数operator<< .此时需要重载输入输出操作符函数,使之能支持模板类. 比如,自定义一个类: #include <QString> class UserType { public: UserType(); QString id; QString name; }; 实例化模板类QList<UserType>,声明一个Us

赋值构造函数(重载赋值操作符)(c++常问问题二)

*什么是赋值构造函数(重载赋值操作符) 下面的代码演示了什么是赋值构造函数,如果不人为定义赋值构造函数,系统将默认给你分配一个浅拷贝的赋值构造函数(下面例子为深拷贝的赋值操作) class cat { public: //构造函数 cat():m_pMyName(NULL),m_unAge(0) { cout<<"cat defult ctor"<<endl; } //子类赋值构造函数(重载赋值操作符) cat& operator=(cat& o

C++ 之 重载赋值操作符

下面是一个基类 Bitmap 和派生类 Widget, Widget 中定义了一个私有类型 (private) 指针 pb class Bitmap { ... }; class Widget { ... private: Bitmap *pb; // ptr to a heap-allocated object };   当在 Widget 类中重载赋值操作符 "=" 时,需要考虑以下几个方面 1  链式赋值 首先要考虑的是,链式赋值 (chain of assignments) 的

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

C++重载赋值操作符

1.C++中重载赋值操作函数应该返回什么? 类重载赋值操作符一般都是作为成员函数而存在的,那函数应该返回什么类型呢?参考内置类型的赋值操作,例如 int x,y,z; x=y=z=15; 赋值行为相当于x=(y=(z=15)),也就是赋值操作应该返回左操作数的引用,因此,为了和内置类型兼容,类中重载赋值操作符应该返回左操作数的引用,即*this,如下类A的重载赋值操作函数的声明, class A{}; A& A::operator=(const A&); 2.确保重载赋值操作具有良好的行为

[转载] C++重载箭头操作符

转自:http://www.cppblog.com/custa/archive/2010/08/15/123491.html 今天看<C++ Primer>的成员访问操作符.看重载箭头操作符部分,刚开始有点迷茫,看了两遍总算有点理解,把心得写在这,与各位分享,如果有错误欢迎指正. 箭头操作符(->)的通常用法是,使用一个类对象的指针来调用该指针所指对象的成员.左操作数为对象指针,右操作数为该对象的成员.定义重载箭头操作符之后看起来就有点特别,可以用类对象的指针来调用,也可以用类对象直接调

C++ 拷贝构造函数和重载赋值操作符相互调用分析 [转]

结论: 从面相对象编程的角度考虑,拷贝构造函数调用重载赋值操作符,重载赋值操作符调用拷贝构造函数的写法都是没有意义的.应该避免. Don't try to implement one of the copying functions in terms of the other. Instead, put common functionality in a third function that both call. ——Effective C++ Third Edition By Scott M

【c++】c++中重载输出操作符,为什么要返回引用

针对:ostream & operator <<(ostream & os, const ClassType &object) 说明几点: 1.第一个形参为对ostream对象的引用,在该对象上将产生输出,ostream为非const,因为写入到流会改变流的状态:该形参是一个引用,因为不能复制ostream对象(在c++中定义的标准输入输出流类istream和ostream,其中拷贝构造函数和赋值操作符函数都被放置在了private部分,且只有声明,没有定义). 2.第

函数重载,操作符重载(王桂林视频笔记)

匹配原则: 1 严格匹配找到则调用 2 通过隐式转换寻找一个匹配,找到则调用 3 上述两项找不到就会报错 ?(隐式)自动转换类型中 double可以转成 float 但是float转换成double会出错,8字节到4字节,损失精度 ? c++允许 int 到 long 和 double 隐式类型转换,遇到这种情况会引起二义性,解决办法可以是使用强制类型转换 ? 鉴于上述, 设计的时候尽量避开隐式类型转换 底层实现:命名倾轧 name mangling mystrlen函数的功能是计算字符串的长度