访问控制与继承:
protected:
1.和私有成员类似,受保护的成员对于类的用户不可访问
2.和公有成员类似,受保护的成员对于派生类的成员和友元可访问
3.派生类的成员和友元只能通过派生类对象访问基类受保护成员。派生类对于基类对象的受保护成员没有任何访问权限
C++ 将对象的构造和析构函数声明为Protected的结果
类型转换:
先看类是否有操作符重载函数,如果有,使用对应的构造函数
然后看类是否具有类型转换函数
lambda:
定义:理解为未命名的内联函数。由捕获列表,参数列表,返回类型,函数体组成。
一定要包含捕获列表和函数体。[] {return 1;}
RAII:
将资源的声明周期绑定到对象,构造时初始化,析构时释放资源。
std::mutex m;
void bad()
{
m.lock(); // 请求互斥
f(); // 若 f() 抛异常,则互斥决不被释放
if(!everything_ok()) return; // 提早返回,互斥决不被释放
m.unlock(); // 若 bad() 抵达此语句,互斥才被释放
}
void good()
{
std::lock_guard<std::mutex> lk(m); // RAII类:请求即是初始化
f(); // 若f()抛异常,则释放互斥
if(!everything_ok()) return; // 提早返回,互斥被释放
}
具有继承与复合的类
class base {
public:
base() { cout << "1base_ctor" << endl; }
~base() { cout << "6base_dtor" << endl; }
};
class component {
public:
component() { cout << "2component_ctor" << endl; }
~component() { cout << "5component_dtor" << endl; }
};
class derived : public base {
public:
derived() : base() { cout << "3derived_ctor" << endl; }
~derived() { cout << "4derived_dtor" << endl; }
private:
component m_data;
};
int main()
{
derived der;
return 0;
}
输出结果:
1base_ctor
2component_ctor
3derived_ctor
4derived_dtor
5component_dtor
6base_dtor
侯捷说有复合和继承的时候不确定构造和析构的先后顺序。
以上代码测试得到在VS2015下:
先后构造基类,成分类,派生类。
先后析构派生类,成分类,基类。
const object不能调用non-const member function