类的默认访问权限是private
结构是public
该关键字修饰的变量可以在类的const方法中修改
class Node { mutable int a = 0; void ChangeA() const { ++a; } }
建议使用如下方式:
//正确 ConstRef::ConstRef(int ii): i(ii), ci(ii), ri(ii) {} //错误 ConstRef::ConstRef(int ii) { i = ii; ci = ii; ri = ii; }
原因:
c++11新特性
class A{ public: A(int ia): a(ia)} {}; A() : A(1){}; //委托给另一个构造函数 }
使用方法:在构造函数声明前面加上该关键字
功能:抑制构造函数的隐式转换。加了之后,不能进行隐式转换,且编辑器也不会在自动转换过程中使用该函数
限制条件:支队一个实参的构造函数有效
class A{ explicit A(string &s); }
因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的。
这意味着它们不是由类的构造函数初始化的。而且一般来说,我们不能在类的内部初始化静态成员。
相反的,必须在类的外部定义和初始化每个静态成员,且只能定义一次。
C++三法则:如果需要析构函数,则一定需要拷贝构造函数和拷贝赋值操作符。原因是如果需要析构函数,则代表类中有类似指针这样无法自动释放的资源,那么为了防止浅拷贝,需要自己重新两个拷贝函数。
C++五法则:在较新的 C++11 标准中,为了支持移动语义,又增加了移动构造函数和移动赋值运算符。与三之法则不同的是,不提供移动构造函数和移动赋值运算符通常不是错误,但会导致失去优化机会。
如果我们不想定义默认的一些函数(比如拷贝或赋值),就可以在声明的时候,后面加上=delete
,表示删除的函数。
struct NoCopy { NoCopy() = default; NoCopy(const NoCopy&) = delete; }
比如iostream就不支持拷贝
注:析构函数不能删除