这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
更多C++类特性
C++类操作符重载
操作符重载就是在特定的类中,赋予某些操作符特地作用于这个类的意义,比如python的numpy中,ndarray类相加可以直接返回
比如说如下一个Time
类:
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);
Time operator+(const Time & t) const;
Time operator-(const Time & t) const;
Time operator*(double n) const;
void Show() const;
};
不看熟悉的变量与方法定义,关注Time operator+(const Time & t) const;
,此为操作符重载的语法。
Time Time::operator+(const Time & t) const
{
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum;
}
C++友元函数
友元函数的介绍是这样的:一般来说只有类内部函数才能自由地访问和修改类内部的变量;但是如果声明某个非类成员函数(比如一个全局函数)为某个类的friend
,那么该函数也能访问类私有变量了。
刚看到这个解释的时候,我觉得很奇怪,那你搞类和类成员函数干嘛呢,还要搞出个友元函数来,岂不是破坏了类的设计?C++ premier plus 这样解释这个问题:把友元函数当成C++类接口的补充,而非一种破坏。类能够决定哪些函数是友元函数,所以依然是OOP的。
C++声明友元的方法如下:
class Car
{
private:
int price;
friend int FriendFunc(int total); //声明友元
};
C++ premier plus用一个例子展示了友元函数的灵活性与优势。以前文提到的time
类为例,time.Show()
这个方法能够打印类私有变量,但是如果能够使用熟悉的cout << trip;
是不是更好呢?很容易想到使用操作符重载,但是操作符重载只能让你这样使用这个语法:trip << cout;
但是如果定义如下的友元函数:
void operator<<(ostream & os, const Time & t) {
os << t.hours << " hours, " << t.minutes << " minutes";
}
就可以使用cout << trip;
这样的语法了。