您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记39——重载输入输出操作符

2016-01-02 20:08 441 查看

1,重载运算符综述

(1)不能定义自己的新运算符,只能对已存在的运算符重载;
(2)C++中大部分运算符都能重载,但仍有5个例外:
. (成员访问运算符)
.*(成员指针解引用操作符 pointer-to-member dereference operator)
::(域操作符)
sizeof(长度运算符)
?:(条件运算符)
或者再加上typeid运算符
(3)重载不能改变运算符的操作数个数;
(4)重载不能改变运算符的优先级;
(5)重载不能改变运算符的结合性;
(6)重载运算符的函数不能有默认的参数;
(7)重载运算符必须至少有一个对象是类对象或类对象的引用,即不能重载内置类型的操作符;
(8)内置的逻辑运算符&&和||有短路求值特性,但是重载后该特性消失;

2,成员函数or友元函数

既可以把重载操作符定义为类的成员函数,也可以把重载操作符定义为类的友元函数。
当操作符为成员函数时,this指针指向左操作数。
通常的规则是:
(1)赋值(=)、下标([])、调用(())、和成员访问箭头(->)必须定义为成员函数,否则编译报错;
(2)单目运算符(如++,--,解引用)和复合赋值运算符(+=,-+……)应当定义为成员函数,但不是强制要求;
(3)双目操作符,如算术、关系、和位操作符最好定义为友元函数
(4)流插入"<<"和流提取">>"运算符、类型转换运算符不能定义为类的成员函数,只能作为友元函数。
试想,如果"<<"成员成员函数,则this指针指向左操作数,变成了本类类型对象,但是通常用的"<<"左操作数是ostream对象

3,重载输出操作符<<

通用形式:
ostream& operator<< (ostream& os, const ClassType& obj)
由上一节可知,"<<"应当用友元函数的方式来重载,所以在类的定义里要作friend声明。
不要遗漏返回类型!这是为了能够将多个输入连在一起。

4,重载输入操作符 >>

通用形式:
istream& operator>> (istream& in, ClassType& obj)
和输出操作符一样,输入操作符也必须定义成友元函数。
和重载输出操作符的区别:
(1)第二个操作数不能再是const引用了,因为这里我们需要改变它的值。
(2)输入操作符必须处理错误和文件结束符的可能。

5,示例

<pre name="code" class="cpp">// 1,类的定义
class Date
{
public:
Date() :year(0), month(0), day(0) {}
Date(int y, int m, int d) :year(y), month(m), day(d) {}
friend ostream& operator<<(ostream& os, const Date& one_day);
friend istream& operator>>(istream& in, Date& one_day);
private:
int year;
int month;
int day;
};

/,2,操作符的定义(即友元函数的定义)
ostream& operator<<(ostream& os, const Date& one_day)
{
os  << one_day.year << "年" << "\t"
<< one_day.month<< "月" << "\t"
<< one_day.day  << "日" ;
return os;  //不要遗漏
}

istream& operator>>(istream& in, Date& one_day)
{
in >> one_day.year >> one_day.month >> one_day.day;
if (!in) //错误处理
{
one_day = Date(); //调用默认构造函数还原数据
}
return in;  //不要遗漏
}

//3,主函数
int main()
{
Date today(2015, 1, 2);
cout << today << endl;

Date tomorrow;
cin >> tomorrow;
cout << tomorrow << endl;

system("pause");
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: