03 - inline, mutable, default, delete

本文介绍了this,mutable,default,delete关键字,在类中是如何被使用的。

inline 关键字

inline除了可以给编译器提供人工的内联建议,更重要的作用就是 打破唯一定义原则(ODR),C++17后对inline的解释是“允许重复定义”,例如把一个非成员函数放到头文件里,被多个编译单元包含,会报错;而给这个函数加上inline,就可以运行。

以下为旧笔记内容:

C++提供了这样一种能力:可以建议函数调用不在生成的代码中实现(即重开个栈空间以供使用)。相反,编译器应将函数体直接插入调用函数的位置(在当前栈中使用)。这个过程被称为内联(inline),具有这一行为的函数被称为内联函数。

在函数声明或定义中函数返回类型前加上关键字inline就可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前不起任何作用。

class Test
{
public:
	void output();
};

inline void Test::output() {}

内联函数的作用,普通函数在调用时需要给函数分配栈空间以供函数执行,压栈等操作会影响成员运行效率,于是C++提供了内联函数将函数体放到需要调用函数的地方,用空间换效率。

需要注意的是:inline关键字只是一个建议,开发者建议编译器将成员函数当做内联函数,一般适合搞内联的情况编译器都会采纳建议。

使用inline关键字可以提高效率,但加大编译后文件大小,现在随着硬件性能的提高,inline关键字用的越来越少了

mutable 关键字

mutable意为可变的,与const相对,被mutable修饰的成员变量,永远处于可变的状态,即便处于一个常函数中,该变量也可以被更改。

这个关键字在现代C++中使用情况并不多,一般来说只有在统计函数调用次数时才会用到。

class Test
{
public:
	void output() const;
private:
	mutable unsigned times = 0;
};

void Test::output() const 
{
	std::cout << "times: " << ++times << std::endl;
}

需要注意的是:

  1. mutable是一种万不得已的写法,一个程序不得不使用mutable关键字时,可以认为这部分程序是一个糟糕的设计。
  2. mutable不能修饰静态成员变量和常成员变量。

mutable关键字是一种没有办法的办法,设计时应该尽量避免,只有在统计函数调用次数这类情况下才推荐使用。这个关键字也称不上是重点。

default 关键字

default关键字的作用很简单:

  1. 在需要默认构造函数却懒得写实现时,便于偷懒。
  2. 也可以对默认复制构造函数,默认的赋值运算符和默认的析构函数使用,表示使用的是系统默认提供的函数,这样可以使代码更加明显,直观。
  3. 现代C++中,哪怕没有构造函数,也推荐将构造函数用default关键字标记,可以让代码看起来更加直观,方便。
class Test
{
public:
	Test() = default;
	Test(const Test& test) = default;
	Test& operator= (const Test& test) = default;
	~Test() = default;
};

default关键字还是推荐使用的,在现代C++代码中,如果需要使用一些默认的函数,推荐用default标记出来。

delete 关键字

C++会为程序生成默认构造函数,默认复制构造函数,默认重载赋值运算符。在很多情况下,我们并不希望这些默认的函数被生成,在C++11以前,只能有将此函数声明为私有函数或是将函数只声明不定义两种方式。

C++11提供了delete关键字,只要在函数最后加上“=delete”就可以明确告诉编译器不要默认生成该函数。

class Test
{
public:
	Test() = delete;
	Test(const Test& test) = delete;
	Test& operator= (const Test& test) = delete;
};

delete关键字还是推荐使用的,在现代C++代码中,如果不希望一些函数默认生成,就用delete表示,这个功能还是很有用的,比如在单例模式中.

参考资料

  • 飘零的落花 - 现代C++详解
  • C++20高级编程
  • 【C++辟谣】inline关键字的作用是“内联优化”?你可能是谭浩强的受害者!inline真正的用途是…_哔哩哔哩_bilibili
  • 被知乎大佬嘲讽后的一个月,我重新研究了一下内联函数 - 知乎 (zhihu.com)