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);
 
原文地址:https://www.cnblogs.com/xiaokuang/p/4571715.html