C++

C++ 知识量:19 - 82 - 316

6.5 特殊用途语言特性><

默认实参- 6.5.1 -

在C++中,函数可以有默认实参。这些默认实参在函数声明或定义中定义,并可以在函数调用时省略。如果函数调用时没有提供足够的实参,则使用默认实参。

例如,以下函数有一个整数参数和一个字符参数,其中字符参数有一个默认值 ' ':

void myFunction(int a, char b = ' ') {  
    // 函数体  
}

在调用该函数时,可以只提供第一个参数,如下所示:

myFunction(10); // 使用默认值 ' '

或者,可以提供两个参数:

myFunction(10, 'X'); // 使用给定的值 'X'

需要注意的是,如果函数有多个参数,则默认实参只能出现在参数列表的末尾。另外,每个参数只能有一个默认值。

内联函数- 6.5.2 -

C++内联函数是一种特殊的函数,它在编译时将函数的代码直接插入到调用该函数的地方,以避免函数调用的开销。内联函数通常用于实现比较简单的函数,因为如果函数过于复杂,编译器可能会选择不进行内联。

要声明一个内联函数,可以在函数声明前面加上 inline 关键字。例如:

inline int add(int a, int b) {  
    return a + b;  
}

在上面的例子中,add() 函数被声明为内联函数。当调用该函数时,编译器将直接将函数的代码插入到调用点,而不是进行常规的函数调用。

注意:内联函数不是强制性的。编译器可以选择忽略内联请求,尤其是对于复杂的函数。通常,内联函数的定义应该在每个使用它的源文件中可见,以便编译器能够正确地插入代码。

constexpr函数- 6.5.3 -

C++中的constexpr函数是一种特殊的函数,它们在编译时计算结果,而不是在运行时计算。使用constexpr函数可以提高代码的性能和可读性。

要声明一个constexpr函数,可以在函数声明前面加上constexpr关键字。例如:

constexpr int add(int a, int b) {  
    return a + b;  
}

在上面的例子中,add()函数被声明为constexpr函数。这意味着编译器将在编译时计算该函数的返回值,而不是在运行时计算。

要使用constexpr函数,必须确保函数的参数在编译时已知。例如,可以使用字面值或常量表达式作为constexpr函数的参数。

constexpr int a = add(1, 2); // 正确      
int b = add(1, 2); // 错误,因为add()函数的参数在运行时确定

需要注意的是,constexpr函数的返回值类型必须是能够在编译时计算的类型。例如,可以使用整数类型、枚举类型、字符类型等作为constexpr函数的返回值类型。

另外,constexpr函数必须在函数体中返回结果。这意味着它们不能使用递归或动态内存分配等技术来计算结果。

调试帮助- 6.5.4 -

assert和NDEBUG是C++预处理中的两个重要工具,它们可以帮助程序员进行调试和优化。

assert宏是一个条件测试宏,如果条件为真,则继续执行程序;如果条件为假,则程序终止。它通常用于在开发阶段检查程序的正确性。例如:

assert(x > 0); // 如果x不大于0,程序会在这里终止

然而,当程序准备发布时,可能希望屏蔽掉这些assert,以防止它们影响程序的运行。此时,可以使用NDEBUG预处理器宏。NDEBUG宏定义后,assert将不会起作用。例如:

#ifndef NDEBUG      
#define assert(expression) ((expression) ? (void)0 : assert_failed(#expression, __FILE__, __LINE__))      
#endif

在这个例子中,如果NDEBUG被定义,assert的定义就会被注释掉,因此不会起作用。这样就可以在发布版本中屏蔽掉assert了。

在实践中,通常在编译选项中加入"-DNDEBUG"来定义NDEBUG,这样就可以在编译时决定是否定义NDEBUG,从而决定是否屏蔽assert。

总的来说,assert和NDEBUG是C++中用于调试和优化程序的强大工具。