C++11中final、override、=default、=delete简介

C++11中final、override、=default、=delete简介

final关键字

final关键字修饰的类是不可以被继承的,语法规则如下:

class A final{};

override关键字

c++语法中在父类中添加virtual关键字的方法可以被子类重写,子类在重写该方法时可以加或者不加virtual关键字。但是这种宽松的规定会带来两个问题:

  1. 放阅读代码得时候,无论子类重写的方法是否添加了virtual关键字,我们都无法直观的确定该方法是否重写了父类方法
  2. 如果在子类中不小心写错了需要重写的方法(参数类型、个数、或者返回值类型),那么此时就变成了一个独立的方法,造程错误,而且编译器在编译时并不会检查到这个错误

所以c++11中为了解决以上两个问题,引入了override关键字,加上该关键字之后,编译器会在编译的阶段作出相应的检查,如果其父类不存在相同的类方法,编译器会报错误。语法规则如下:

class A 
{
public:
	virtual func(int a, char b){}
};

class B:A 
{
public:
    virtual func(int a, char b) override {}
};

=default语法

c++中如果没有显示的给出构造函数、析构函数、拷贝构造函数、operator=这几个函数的实现,则在需要它们的时候,编译器会自动生成;或者在给出这些函数的声明时,没有给出其实现,则编译器也会在链接时报错。如果使用=default标记这类函数,则编译器会给出默认的实现。例如:

class A
{
public:
    A(int a) {}
};

int main(int argc, char **argv)
{
    A a;
    return 0;
}

这样写会报错,编译器不会自动生成无参的构造函数,可以使用=default语法让编译器自己生成

class A
{
public:
    A() = default;
    A(int a) {}
};

int main(int argc, char **argv)
{
    A a;
    return 0;
}

=delete语法

除了可以强制让编译器自动生成构造函数、析构函数、拷贝构造函数、operator=,还可以禁止编译器自动生成这些函数,那就是=delete。

在c++11之前,如果想让一个类不能被拷贝,则可以将拷构造函数和operate=函数设置为private的:

class A
{
public:
    A() = default;
    ~A() = default;

private:
    A(const A &a) {}
    A &operator=(const A &a) {}
};

int main(int argc, char **argv)
{
    A a1;
    A a2(a1);  // error
    A a3;  
    a3 = a1;   // error
    
    return 0;
}

现在可以使用=delete语法实现

class A
{
public:
    A() = default;
    ~A() = default;

    A(const A &a) = delete;
    A &operator=(const A &a) = delete;
};

int main(int argc, char **argv)
{
    A a1;
    A a2(a1); // error
    A a3;
    a3 = a1;  // error

    return 0;
}

如果本文对你有帮助,记得一键三连哦,一键三连笑哈哈,代码能力顶呱呱!

本人能力有限,如有错误,望不吝指正;原创不易,欢迎转载,转载请注明出处!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值