zoukankan      html  css  js  c++  java
  • C++知识总结--类

    1. 类的成员访问控制

    类的成员三种访问类型:public,private,protected(默认为private

    while, 结构体的默认访问类型为public

    2.  const成员函数

    class A { 
    
    public: 
    
      void func ( ) const;  /* promise not to change invoking object */
    
    };
    
    void A::func( ) const {
    
      ...
    
    }
    
    const A a;  /* a is constant object */
    
    类的const对象只能调用类的const成员函数

    3. 操作符重载

    操作符左侧的对象是调用对象,操作符右侧的对象是作为参数被传递的对象

    class Time {
    private:
        int hours;
        int minutes;
    public:
        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 = sum.minutes % 60;   return sum; }

    int main() {
      Time a;
      Time b;
      Time total;

      total = a + b;
    }

    不能重载的操作符:

    sizeof

    成员操作符"."

    成员指针操作符"*"

    "::"

    "?:"

    typeid

    const_cast

    static_cast

    dynamic_cast

    reinterpret_cast

    大多数操作符都可以通过成员函数或者非成员函数进行重载,但下面的操作只能重载为成员函数

    =   赋值操作符

    ()   函数调用操作符

    []  下标操作符

    -> 通过指针访问成员的操作符

    4. 友元

    为啥要友元:举个栗子

    class Time {
    private:
        int hours;
        int minutes;
    public:
        Time operator* (double m) const;
    };
    
    像上面这样写的话,在调用时操作符左侧必须是类对象

    自然地会改写为 Time
    operator*(double m, const Time &t);
    使用非成员函数可以按照所需的顺序获得操作数,但是非成员函数不能访问类的私有数据
    而通过让函数成为类的友元,可以赋予函数与类的成员函数相同的访问权限。

    class Time {
    private:
        int hours;
        int minutes;
    public:
        friend Time operator* (double m, const Time &t);
    };
    
    Time operator*(double m, const Time &t) {
      Time result;
      result.minutes = t.hours * m * 60 + t.minutes * 60;
      result.hours = result.minutes / 60;
      result.minutes = result.minutes % 60;
      return result;
    }
    /* 申明时需要加上friend关键字,而在定义时不需要加friend关键字 */

    重载<<

    void operator<<(ostream &os, const Time &t);  /* 不能拼接输出,cout<<"haha"<<t<<endl; 是不能工作的 */
    ostream& operator<<(ostream &os, const Time &t);
     
  • 相关阅读:
    how to use epoll with python
    tornado ioloop current和instance的一些区别
    网络标准及路由器速度
    C语言接口

    Dalvik 与 ART
    Android学习笔记47-使用HttpClient接口实现网络通信
    Android学习笔记46-使用Post方式提交数据
    Android学习笔记45-JSON数据解析(GSON方式)
    Android学习笔记44-JSON数据解析
  • 原文地址:https://www.cnblogs.com/xiaokuang/p/4571715.html
Copyright © 2011-2022 走看看