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++中的函数重载特性,因此一定要对应参数进行函数定义
|