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

原因:

  1. 效率不同,后者是先初始化再赋值,前者是直接初始化
  2. 如果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就不支持拷贝

注:析构函数不能删除

posted @ 2022-01-17 00:41  二律背反GG  阅读(35)  评论(0编辑  收藏  举报