前端学C++

466 阅读2分钟

这是我参与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;这样的语法了。