IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++基础(C++Primer学习) -> 正文阅读

[C++知识库]C++基础(C++Primer学习)

C++基础(六)

第十一章 类的使用

一、运算符重载
在之前的博客笔记当中已经介绍过运算符重载以及怎样实现运算符重载,这里不再赘叙。
书上的例题:计算时间,一个运算符重载实例。
首先创建一个类以及其中的成员函数声明,因为我们的习惯是将类声明在头文件当中,类的成员函数定义在一个单独的cpp文件中,如果使用Visual Stdio的话,点击项目->添加类,编辑器就会自动创建头文件,.cpp文件,同时在头文件中写好类的框架😁。
在这里插入图片描述
1、类的声明

#pragma once
#include<iostream>
using namespace std;
class Time
{
private:
	int hours;
	int minutes;
public:
	Time();
	Time(int h, int m = 0);
	void Addmin(int m);
	void Addhr(int h);
	void reset(int h = 0, int m = 0);
	void show()const;
	Time operator+(Time& t)const;
	Time Sum(const Time& t)const;
};

2、类的成员函数定义

#include "My_timer.h"

Time::Time()
{
	minutes = 0;
	hours = 0;
}

Time::Time(int h, int m)
{
	hours = h;
	minutes = m;
}

void Time::Addmin(int m)
{
	minutes += m;
	hours += minutes / 60;
	minutes %= 60;
}

void Time::Addhr(int  h)
{
	hours += h;
}

void Time::reset(int h, int m)
{
	hours = h;
	minutes = m;

}

Time Time::Sum(const Time&t)const
{
	Time sum;
	sum.minutes = minutes + t.minutes;
	sum.hours = hours + t.hours+sum.minutes/60;
	sum.minutes %= 60;
	return sum;
}

void Time::show()const
{
	cout << hours << ":"
		<< minutes << endl;
}

Time Time::operator+(Time& t)const
{
	Time temp;
	temp.minutes = minutes + t.minutes;
	temp.hours = hours + t.hours+temp.minutes/60;
	temp.minutes %= 60;
	return temp;
}

在这里写了两个求和函数,第一个就是利用自建函数Sum()来完成两个对象的时间相加,第二中方法则是利用运算符重载了+号来完成两个对象的时间相加。
3、运算符验证

int main()
{
	Time time1(2, 40);
	Time time2(3, 50);
	Time time3 = time2.Sum(time1);
	time3.show();
	Time time4 = time1 + time2;
	time4.show();
	....

通过上述程序,可以看到运算符重载与sun函数的作用相同。其中重载运算符也就是赋予运算符额外的一种运算属性,这种属性也是有作用域的。
笔记:函数参数使用引用格式可以提高代码运行效率,如果是传值操作将会浪费内存同时降低运行速度,因为系统首先会将参数拷贝一份。
问题:三个及三个以上的对象相加可行吗?编译过程是如何的?

time5 = time1+time2+time3;  //可以么?

答案:可以的,但是运算符是左结合,所以该程序首先变为:
time5 = time1.sum(time2+time3);
接着…
4、重载限制
(1)、重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户对标准类型运算符进行重载(也没必要)。
(2)、使用运算符时不能违背运算符原来的法则。
(3)、不能修改运算符的优先级
(4)、不能将不是运算符的符号重载。
(5)、不能重载的运算符:sizeof,typeid,const_cast(强制类型转换)等等。。。。。
笔记:大多数运算符都可以通过成员或者非成员函数进行重载,但是有一部分运算符只能通过成员函数进行重载: =、()、[]、->
5、关于 赋值运算符

Time time6 = (3, 50);

对于上述代码,在没有重载 =运算符时,编译器也会自动去匹配类里面的构造函数,如果找了类型相匹配的构造函数就可以编译程序。
也就是说=运算符是有默认重载功能的。

二、友元函数
为了使非类成员的函数能够访问类内部数据(也就是private型数据),提出了友元函数。友元函数不属于该类的内部成员,但是可以访问类内部的私有数据。
创建友元函数的第一步就是在类声明中进行函数声明,并加上关键字friend修饰。
在上面创建的类中添加一个友元函数:

class Time
{
private:
	int hours;
	int minutes;
public:
	friend void show_time(Time&t);
	Time();
	Time(int h, int m = 0);
	void Addmin(int m);
	void Addhr(int h);
	void reset(int h = 0, int m = 0);
	void show()const;
	Time operator+(Time& t)const;
	Time Sum(const Time& t)const;
};

可以到看show_time(Time&t)函数是一个成员函数,由于友元函数不是类成员,因此定义友元函数不需要加该类的作用域,也同时也不要再使用friend关键字进行修饰:

void show_time(Time &t)
{
	cout << t.hours <<"  :  "<< t.minutes << endl;

}

注:由于C++中的函数重载特性,因此一定要对应参数进行函数定义

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 11:51:13  更:2021-12-07 11:51:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:50:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码