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

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;
}


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值