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