第八章 C++函数的高级特性(8.3 参数的缺省值 8.4 运算符重载 8.5 函数内联)
2010-11-18 10:37
267 查看
8.3 参数的缺省值
参数缺省值的使用规则:
【规则8-3-1】参数缺省值只能出现在函数的声明中,而不能出现在定义体中。
例如:
void Foo(int x=0, int y=0); // 正确,缺省值出现在函数的声明中
void Foo(int x=0, int y=0) // 错误,缺省值出现在函数的定义体中
{
⋯
}
【规则8-3-2】如果函数有多个参数,参数只能从后向前挨个儿缺省,否则将导致函数调用语句怪模怪样。
正确的示例如下:
void Foo(int x, int y=0, int z=0);
错误的示例如下:
void Foo(int x=0, int y, int z=0);
8.4 运算符重载
在C++语言中,可以用关键字operator 加上运算符来表示函数,叫做运算符重载。
8.4.2 不能被重载的运算符
在C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。
(1)不能改变C++内部数据类型(如int,float 等)的运算符。
(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。
(3)不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。
(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。
8.5 函数内联
8.5.1 用内联取代宏代码
C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。在C 程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return 等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。
inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。如下风格的函数Foo 不能成为内联函数:
// inline 仅与函数声明放在一起
void Foo(int x, int y)
{
}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
}
内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换。假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。
参数缺省值的使用规则:
【规则8-3-1】参数缺省值只能出现在函数的声明中,而不能出现在定义体中。
例如:
void Foo(int x=0, int y=0); // 正确,缺省值出现在函数的声明中
void Foo(int x=0, int y=0) // 错误,缺省值出现在函数的定义体中
{
⋯
}
【规则8-3-2】如果函数有多个参数,参数只能从后向前挨个儿缺省,否则将导致函数调用语句怪模怪样。
正确的示例如下:
void Foo(int x, int y=0, int z=0);
错误的示例如下:
void Foo(int x=0, int y, int z=0);
8.4 运算符重载
在C++语言中,可以用关键字operator 加上运算符来表示函数,叫做运算符重载。
8.4.2 不能被重载的运算符
在C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。
(1)不能改变C++内部数据类型(如int,float 等)的运算符。
(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。
(3)不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。
(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。
8.5 函数内联
8.5.1 用内联取代宏代码
C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。在C 程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return 等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。
inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。如下风格的函数Foo 不能成为内联函数:
// inline 仅与函数声明放在一起
void Foo(int x, int y)
{
}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
}
内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换。假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。
相关文章推荐
- 第八章 高质量C编程规范C++函数的高级特性
- 第八章 C++函数的高级特性(8.1 函数重载的概念)
- 第八章 C++函数的高级特性(8.2 成员函数的重载、覆盖与隐藏)
- C++函数的高级特性-函数重载
- 第8章 C++函数的高级特性
- c++函数缺省参数
- c++中的命名空间、函数重载、缺省参数
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
- [置顶] C++ 通用可变参数高级函数模板
- 高质量C++/C编程指南 -- 第8章 C++函数的高级特性
- C++ 缺省参数 重载 C++编译器的函数名修饰规则
- Python高级特性:函数参数传递研究
- 北大 C++ 1.7 内联函数、函数重载和函数缺省参数
- c++第一节之函数重载与缺省参数
- [c/c++]函数参数缺省值
- 高质量C++编程_第8章_C++函数的高级特性(1)
- C高级(5)--C++函数的高级特性
- 高质量编程--C++函数的高级特性
- C++函数的高级特性-函数重载
- C++函数的高级特性