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);