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;
}
需要注意的是:
mutable
是一种万不得已的写法,一个程序不得不使用mutable
关键字时,可以认为这部分程序是一个糟糕的设计。mutable
不能修饰静态成员变量和常成员变量。
mutable
关键字是一种没有办法的办法,设计时应该尽量避免,只有在统计函数调用次数这类情况下才推荐使用。这个关键字也称不上是重点。
default 关键字
default
关键字的作用很简单:
- 在需要默认构造函数却懒得写实现时,便于偷懒。
- 也可以对默认复制构造函数,默认的赋值运算符和默认的析构函数使用,表示使用的是系统默认提供的函数,这样可以使代码更加明显,直观。
- 现代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)