目录
  • 一、友元函数
    • 1.1重载operator<<
    • 1.2友元函数
    • 1.3友元类
  • 二、关键字const
    • 2.1const修饰类的成员函数
  • 三、关键字static
    • 3.1static类成员
    • 3.2面试题
  • 总结

    一、友元函数

    1.1重载operator<<

    问题:现在我们尝试去重载operator<<,然后发现我们没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以我们要将operator<<重载成全局函数。但是这样的话,又会导致类外没办法访问成员,那么这里就需要友元来解决。operator>>同理。

    class Date
    {
    public:
    Date(int year, int month, int day)
    : _year(year)
    , _month(month)
    , _day(day)
    {}
    ostream& operator<<(ostream& _cout)
    {
    _cout<<d._year<<"-"<<d._month<<"-"<<d._day;
    return _cout;
    }
    prvate:
    int _year;
    int _month;
    int _day
    };
    int main()
    {
    Date d(2017, 12, 24);
    d<<cout;
    return 0;
    }
    

    但"d<<cout"可读性很低,所以我们尝试需要在类外部重载operator<<

    1.2友元函数

    友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

    class Date
    {
    friend ostream& operator<<(ostream& _cout, const Date& d);
    friend istream& operator>>(istream& _cin, Date& d);
    public:
    Date(int year, int month, int day)
    : _year(year)
    , _month(month)
    , _day(day)
    {}
    private:
    int _year;
    int _month;
    int _day;
    };
    ostream& operator<<(ostream& _cout, const Date& d)
    {
    _cout<<d._year<<"-"<<d._month<<"-"<<d._day;
    return _cout;
    }
    istream& operator>>(istream& _cin, Date& d)
    {
    _cin>>d._year;
    _cin>>d._month;
    _cin>>d._day;
    return _cin;
    }
    int main()
    {
    Date d;
    cin>>d;
    cout<<d<<endl;
    return 0;
    

    1.友元函数可访问类的私有和保护成员,但不是类的成员函数

    2.友元函数不能用const修饰

    3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制

    4.一个函数可以是多个类的友元函数

    5.友元函数的调用与普通函数的调用和原理相同

    1.3友元类

    1.友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

    2.友元关系是单向的,不具有交换性。

    比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。

    3.友元关系不能传递如果B是A的友元,C是B的友元,则不能说明C时A的友元。

    class Date; // 前置声明
    class Time
    {
    friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成
    员变量
    public:
    Time(int hour, int minute, int second)
    : _hour(hour)
    , _minute(minute)
    , _second(second)
    {}
    private:
    int _hour;
    int _minute;
    int _second;
    };
    class Date
    {
    public:
    Date(int year = 1900, int month = 1, int day = 1)
    : _year(year)
    , _month(month)
    , _day(day)
    {}
    void SetTimeOfDate(int hour, int minute, int second)
    {
    // 直接访问时间类私有的成员变量
    _t._hour = hour;
    _t._minute = minute;
    _t.second = second;
    }
    private:
    int _year;
    int _month;
    int _day;
    Time _t;
    };
    

    二、关键字const

    2.1const修饰类的成员函数

    将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

    C++示例讲解friend static const关键字的用法

    总结:

    1.const对象不能调用非cosnt成员函数(权限放大:const Date* -> Date*)

    2.非const对象可以调用const成员函数

    3.const成员函数不能调用非cosnt成员函数(权限放大)

    4.非cosnt成员函数可以调用const成员函数

    三、关键字static

    3.1static类成员

    概念:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化

    特性:

    • 静态成员为所有类对象所共享,不属于某个具体的实例
    • 静态成员变量必须在类外定义,定义时不添加static关键字
    • 类静态成员即可用类名::静态成员或者对象.静态成员来访问
    • 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
    • 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

    3.2面试题

    面试题:实现一个类,计算中程序中创建出了多少个类对象。

    class A
    {
    public:
    A() {++_scount;}
    A(const A& t) {++_scount;}
    static int GetACount() { return _scount;}
    private:
    static int _scount;
    };
    int A::_count = 0;
    void TestA()
    {
    cout<<A::GetACount()<<endl;
    A a1, a2;
    A a3(a1);
    cout<<A::GetACount()<<endl;
    }
    

    注意:

    1.静态成员函数不能调用非静态成员函数

    2.非静态成员函数可以调用静态成员函数

    总结

    以上就是关于C++关键字friend ,static,const 全部总结,感谢大家的阅读观看

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。