学习 c++11 之各种小技巧

作者: | 更新日期:

这里介绍很多 c++11 的小技能。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

之前提到,我们开始从 c98 切换到 c++11 了。

所以我打算分一个系列来介绍常见的 c++11 的语法。

今天要分享的第五个知识点是一系列小技巧,看一眼就可以学会吧。

一、空指针

在以前 c/c++ 的语法中,我们空指针都是使用 NULL 来表示,甚至有些 heak 使用 0 来表示。

由于NULL只是一个宏,本质上是整型。
这导致某些模板或者重载的时候定位到整型参数而不是指针参数,从而出错。

于是c++11中引入了空指针nullptr

nullptr是一个指针类型,可以隐式转化为任何指针类型。

使用如下:

char *pc = nullptr; 
foo(pc);

//调用一个指针为参数的函数
foo(nullptr);  

二、默认构造函数

c++有一个很烦人的语法,当我们重载构造函数时,默认构造函数如果没有实现,就不能通过无参数的形式创建这里类。

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

A a; //error

c++11 支持了一个语法,让默认构造函数不实现也能使用。

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

A a;

看起来,相比写一个{},写= default; 好像更麻烦。

但是不要忘了,一个类还有赋值运算符移动运算符移动构造函数等。
对于上面提到的三类,默认就不是一个{}了,此时将会特别有用。

三、禁止函数

c++中,我们如果想禁用一个类函数的时候,可以只声明不定义。
单例经常这样做,但是这样看起来像是少写了什么。

现在c++11明确给了一个语法:= delete

class A{
    A(A) = delete;
    operator= (const A&) = delete;
public:
    A* ins(){
        static A a;
        return &a;
    };
};

四、需要重载

在实现多态继承时,子类经常会无意间重载掉基类的某个虚函数,这就导致很隐藏的BUG。

现在,c++11可以加override关键字后,就可以要求编译器对重载的函数进行参数类型强检查。

override明确的表示一个函数是对基类中的虚函数进行重载。
这时候,就编译器就可以检查函数签名是否一致了。

五、禁止重载

有时候,由于安全,某些类或函数不希望被继承或重载了。

之前是做不到的,现在可以通过final关键字来做到。

class TaskManager {/*..*/} final; 

class A{
pulic:
  virtual void func() const;
};
class  B: A{
pulic:
  void func() const final; //OK
};

六、最后

好了,这里介绍了空指针、默认函数、禁止函数、声明继承、禁止继承重载五个c++11的语法。

应该常用的就这些了吧, 你觉得c++11还有什么不错的语法吗?

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越