C++小知识点(五)------C++ primer plus中文版(第六版)

1、运算符重载

1.1、运算符重载的使用

C++允许将运算符重载扩展到用户自定义的类型,例如对象的相加、比较等等。这种运算符重载隐藏了内部机制,但强调了实质。

运算符重载语法:
	operator symbol(argument-list)
	
	class Time
	{
	private:
		int hours;
		int minutes;
	public:
		Time();
		Time(int h, int m);
		Time operator+(const Time &t)const;
		void show()const;
	};
	
	Time::Time()
	{
		hours = minutes = 0;
	}
	Time::Time(int h, int m)
	{
		minutes = m;
		hours = h;
	}
	
	Time Time::operator+(const Time &t)const
	{
		Time time;
		time.minutes = minutes + t.minutes;
		time.hours = hours + t.hours + time.minutes / 60;
		time.minutes = time.minutes % 60;
		return time;
	}
	
	void Time::show()const
	{
		cout << hours << " hours, " << minutes << " minutes" << endl;
	}

int main()
{
	Time time1(2,40);				普通构造函数的隐式调用
	Time time2(1,50);				普通构造函数的隐式调用
	Time t_time1,t_time2;			默认构造函数的隐式调用
	t_time1 = time1 + time2;		运算符重载调用方法一
	t_time2 = t_time1 + time2;		运算符重载调用方法二
	return 0;
}
1、上述代码中Time Time::operator+(const Time &t)const,显示访问对象为const,隐式访问对象也是const,但是返回的为什么不是const类型?
因为const类型可以赋给非const类型,但是反过来就不行。
2、参数类型为引用,但是返回值不是引用?
参数类型和返回值类型其实没有关联性,主要看你怎么使用,引用做参数比值传递更快,返回非引用是因为我们返回的是局部对象,由前面可知函数执行完毕之后,局部对象会消失,因此引用将指向不存在的数据,存在危险性。

1.2、运算符重载的限制

参考P316

1、	运算符重载不必是成员函数,可以作为友元函数,但是有些运算符必须作为成员函数重载。
2、	至少一个操作数为用户自定义的类型,避免对标准类型运算符重载;
3、	运算符优先级不可修改
4、	不能创建新的运算符
5、	有些运算符不可重载

2、友元函数

2.1、友元函数存在的意义

使用友元函数将使该函数与类的成员函数对于类的数据成员有着相同的访问权限。

1、 友元函数的创建:声明原型放在类中,但是声明前需要加上friend
	class Time
	{
	private:
		int hours;
		int minutes;
	public:
		Time();
		Time(int h, int m);
		void show()const;
		friend operator+(const Time &t, const Time &s);
	};
	在类中声明,但不是类的成员函数,不能使用成员运算符调用,但两者访问权限相同。
	
2、	友元函数的定义:无须使用作用域解析运算法::
	friend operator+(const Time &t, const Time &s)
	{
		Time time;
		time.minutes = t.minutes + s.minutes;
		time.hours = t.hours + s.hours + time.minutes / 60;
		time.minutes = time.minutes % 60;
		return time;
	}

3、 友元函数的调用
int main()
{
	Time time1(1, 40);
	Time time2(2, 50);
	Time t_time1;
	t_time1 = operator+(time1, time2);			方式一
	t_time1 = time1 + time2;					方式二
	t_time1.show();
	return 0;
}

2.2、使用友元函数重载<<

友元函数的使用场景:

参数的顺序问题,友元函数可以反转操作数的顺序
因为成员函数必须通过对象来调用,而友元函数不需要,当非类的项作为第一个操作数时,使用友元函数更加简便
例如:<<,因为成员函数必须为第一操作数,使用如下: time << cout;这样子使用让人迷惑。

第一种版本:
	class Time
	{
	private:
		int hours;
		int minutes;
	public:
		Time();
		Time(int h, int m);
		friend void operator<<(std::ostream &os, const Time &t);
	};
	
	Time::Time()
	{
		hours = minutes = 0;
	}
	Time::Time(int h, int m)
	{
		minutes = m;
		hours = h;
	}
	
	void operator<<(std::ostream &os, const Time &t)
	{
		os << t.hours << " hours, " << t.minutes << " minutes" << endl;
	}

	int main()
	{
		Time time(1, 40);
		cout << time;
		return 0;
	}

第二种版本:
	class Time
	{
	private:
		int hours;
		int minutes;
	public:
		Time();
		Time(int h, int m);
		friend std::ostream & operator<<(std::ostream &os, const Time &t);
	};
	
	Time::Time()
	{
		hours = minutes = 0;
	}
	Time::Time(int h, int m)
	{
		minutes = m;
		hours = h;
	}
	
	返回的是std::ostream &对象,可以多次输出
	std::ostream & operator<<(std::ostream &os, const Time &t)
	{
		os << t.hours << " hours, " << t.minutes << " minutes" << endl;
		return os;
	}

	int main()
	{
		Time time1(1, 40);
		Time time2(2, 50);
		cout << time1 << time2;				多次输出
		return 0;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "C Primer Plus" 是一本经典的 C 语言教程书籍,它旨在为初学者提供一种深入浅出、易于理解的方式来学习 C 语言的基础知识和应用技巧。这本书结构清晰,内容详实,深入浅出地讲解了 C 语言的各个方面,包括变量、数据类型、运算符、流程控制、函数、指针、结构体、文件操作等。通过逐步增加难度的方式,读者可以逐步领会 C 语言的精髓,从初学者成长为具备一定经验和技能的程序员。 与其他 C 语言教程不同的是,"C Primer Plus" 强调实战教学,让读者通过不断练习和编写实际程序来理解和掌握 C 语言的各种应用,从而在实际工作中更加得心应手。此外,书中也提供了大量的练习题和实例代码,方便读者自行探索和实践。 总之,"C Primer Plus" 是一本教授 C 语言的经典著作,它基于深入的理论知识,提供了大量的实战编程练习机会,适合想要深入学习 C 语言的初学者和有一定经验的程序员。 ### 回答2: 《C Primer中文版是一本经典的C语言教程,原版为《C Primer Plus》,是一本聚焦于C语言程序设计入门、进阶和实践的杰出著作。本书全面覆盖了C语言语法、函数、指针、数组、字符串、文件操作、内存管理等核心内容,包含丰富的示例和练习,让学习者逐步了解和掌握C语言的核心要素。 《C Primer中文版相比于英文原版,更方便中国学生阅读和理解。该书的内容体系完整,难度逐渐递增,因此对于C语言零基础的读者来说,也能循序渐进地学习C语言。该书知识点分类清晰,讲解详细,涵盖了C语言绝大部分特性和工具,有助于读者构建系统的学习框架,能够从小白逐步走向合格C程序员的道路上。 《C Primer中文版是学习C语言必备的参考书籍之一,它不仅适用于学生自学,也适用于教授C程序设计的教师作为教材使用。它具有深入浅出、通俗易懂和良好的示范性质。对于只有一定编程经验的读者,该书也是适合挑战的好书。无论你是初学者还是进阶爱好者,它都能帮助你打下坚实的编程基础,快速提升编程实践能力,成为一个有成就的程序员。 ### 回答3: C Primer Plus 中文版是一本通俗易懂、系统完整的C语言教材,由Stephen Prata编写。其最新版为第六版,内容涵盖了从C语言的基础概念到高级特性的知识点,详细介绍了函数、指针、数组、结构体、文件操作、动态内存分配等重要概念和技术应用。全书分为26章,每章都配有大量的例子和练习题,使读者能够深入了解C语言的应用和开发方法,同时提供了大量的修改和调试技巧。 C Primer Plus 中文版不仅适用于初学C语言的新手,也可以作为已有C语言基础但需要提高的人员的参考书。此外,该书还涵盖了C语言编程的规范要求和工程实践,非常适合从事C语言编程的软件开发人员阅读和学习。总之,C Primer Plus 中文版是学习C语言的入门必备教材之一,无论是基础学习和提高深入,都具有重要的学习价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值