删除 6.1 引用参数

This commit is contained in:
归故里 2024-02-08 13:41:28 +08:00
parent ab6a835447
commit 1e3ce2ebab

View File

@ -1,43 +1,7 @@
6. 其他 C++ 特性 6. 其他 C++ 特性
---------------------------- ----------------------------
6.1. 引用参数 6.1. 右值引用
~~~~~~~~~~~~~~~~~~~~~~
.. tip::
所有按引用传递的参数必须加上 ``const``.
定义:
在 C 语言中, 如果函数需要修改变量的值, 参数必须为指针, 如 ``int foo(int *pval)``. 在 C++ 中, 函数还可以声明引用参数: ``int foo(int &val)``.
优点:
定义引用参数防止出现 ``(*pval)++`` 这样丑陋的代码. 像拷贝构造函数这样的应用也是必需的. 而且更明确, 不接受 ``NULL`` 指针.
缺点:
容易引起误解, 因为引用在语法上是值变量却拥有指针的语义.
结论:
函数参数列表中, 所有引用参数都必须是 ``const``:
.. code-block:: c++
void Foo(const string &in, string *out);
事实上这在 Google Code 是一个硬性约定: 输入参数是值参或 ``const`` 引用, 输出参数为指针. 输入参数可以是 ``const`` 指针, 但决不能是非 ``const`` 的引用参数,除非用于交换,比如 ``swap()``.
有时候,在输入形参中用 ``const T*`` 指针比 ``const T&`` 更明智。比如:
* 您会传 null 指针。
* 函数要把指针或对地址的引用赋值给输入形参。
总之大多时候输入形参往往是 ``const T&``. 若用 ``const T*`` 说明输入另有处理。所以若您要用 ``const T*``, 则应有理有据,否则会害得读者误解。
6.2. 右值引用
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -68,7 +32,7 @@
.. _function-overloading: .. _function-overloading:
6.3. 函数重载 6.2. 函数重载
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -99,7 +63,7 @@
如果您打算重载一个函数, 可以试试改在函数名里加上参数信息。例如,用 ``AppendString()````AppendInt()`` 等, 而不是一口气重载多个 ``Append()``. 如果您打算重载一个函数, 可以试试改在函数名里加上参数信息。例如,用 ``AppendString()````AppendInt()`` 等, 而不是一口气重载多个 ``Append()``.
6.4. 缺省参数 6.3. 缺省参数
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -132,7 +96,7 @@
const AlphaNum &c = gEmptyAlphaNum, const AlphaNum &c = gEmptyAlphaNum,
const AlphaNum &d = gEmptyAlphaNum); const AlphaNum &d = gEmptyAlphaNum);
6.5. 变长数组和 alloca() 6.4. 变长数组和 alloca()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -151,7 +115,7 @@
改用更安全的分配器allocator就像 ``std::vector````std::unique_ptr<T[]>``. 改用更安全的分配器allocator就像 ``std::vector````std::unique_ptr<T[]>``.
6.6. 友元 6.5. 友元
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -164,7 +128,7 @@
.. _exceptions: .. _exceptions:
6.7. 异常 6.6. 异常
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -209,7 +173,7 @@
.. _RTTI: .. _RTTI:
6.8. 运行时类型识别 6.7. 运行时类型识别
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TODO TODO
@ -270,7 +234,7 @@
不要去手工实现一个类似 RTTI 的方案. 反对 RTTI 的理由同样适用于这些方案, 比如带类型标签的类继承体系. 而且, 这些方案会掩盖你的真实意图. 不要去手工实现一个类似 RTTI 的方案. 反对 RTTI 的理由同样适用于这些方案, 比如带类型标签的类继承体系. 而且, 这些方案会掩盖你的真实意图.
6.9. 类型转换 6.8. 类型转换
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -301,7 +265,7 @@
.. _streams: .. _streams:
6.10. 流 6.9. 流
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -354,7 +318,7 @@
每一种方式都是各有利弊, "没有最好, 只有更适合". 简单性原则告诫我们必须从中选择其一, 最后大多数决定采用 ``printf + read/write``. 每一种方式都是各有利弊, "没有最好, 只有更适合". 简单性原则告诫我们必须从中选择其一, 最后大多数决定采用 ``printf + read/write``.
6.11. 前置自增和自减 6.10. 前置自增和自减
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -377,7 +341,7 @@
对简单数值 (非对象), 两种都无所谓. 对迭代器和模板类型, 使用前置自增 (自减). 对简单数值 (非对象), 两种都无所谓. 对迭代器和模板类型, 使用前置自增 (自减).
6.12. ``const`` 用法 6.11. ``const`` 用法
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -414,7 +378,7 @@
这是说, 我们提倡但不强制 ``const`` 在前. 但要保持代码的一致性! (Yang.Y 注: 也就是不要在一些地方把 ``const`` 写在类型前面, 在其他地方又写在后面, 确定一种写法, 然后保持一致.) 这是说, 我们提倡但不强制 ``const`` 在前. 但要保持代码的一致性! (Yang.Y 注: 也就是不要在一些地方把 ``const`` 写在类型前面, 在其他地方又写在后面, 确定一种写法, 然后保持一致.)
6.13. ``constexpr`` 用法 6.12. ``constexpr`` 用法
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -437,7 +401,7 @@
靠 constexpr 特性,方才实现了 C++ 在接口上打造真正常量机制的可能。好好用 constexpr 来定义真・常量以及支持常量的函数。避免复杂的函数定义以使其能够与constexpr一起使用。 千万别痴心妄想地想靠 constexpr 来强制代码「内联」。 靠 constexpr 特性,方才实现了 C++ 在接口上打造真正常量机制的可能。好好用 constexpr 来定义真・常量以及支持常量的函数。避免复杂的函数定义以使其能够与constexpr一起使用。 千万别痴心妄想地想靠 constexpr 来强制代码「内联」。
6.14. 整型 6.13. 整型
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -482,7 +446,7 @@
因此, 使用断言来指出变量为非负数, 而不是使用无符号型! 因此, 使用断言来指出变量为非负数, 而不是使用无符号型!
6.15. 64 位下的可移植性 6.14. 64 位下的可移植性
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -544,7 +508,7 @@
.. _preprocessor-macros: .. _preprocessor-macros:
6.16. 预处理宏 6.15. 预处理宏
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -565,7 +529,7 @@
- 不要试图使用展开后会导致 C++ 构造不稳定的宏, 不然也至少要附上文档说明其行为. - 不要试图使用展开后会导致 C++ 构造不稳定的宏, 不然也至少要附上文档说明其行为.
- 不要用 ``##`` 处理函数,类和变量的名字。 - 不要用 ``##`` 处理函数,类和变量的名字。
6.17. 0, ``nullptr````NULL`` 6.16. 0, ``nullptr````NULL``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -578,7 +542,7 @@
字符 (串) 用 ``'\0'``, 不仅类型正确而且可读性好. 字符 (串) 用 ``'\0'``, 不仅类型正确而且可读性好.
6.18. sizeof 6.17. sizeof
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -604,7 +568,7 @@
return false; return false;
} }
6.19. auto 6.18. auto
~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -677,7 +641,7 @@
.. _braced-initializer-list: .. _braced-initializer-list:
6.20. 列表初始化 6.19. 列表初始化
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -767,7 +731,7 @@
.. _lambda-expressions: .. _lambda-expressions:
6.21. Lambda 表达式 6.20. Lambda 表达式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -805,7 +769,7 @@
.. _template-metaprogramming: .. _template-metaprogramming:
6.22. 模板编程 6.21. 模板编程
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
不要使用复杂的模板编程 不要使用复杂的模板编程
@ -836,7 +800,7 @@
.. _boost: .. _boost:
6.23. Boost 库 6.22. Boost 库
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::
@ -889,7 +853,7 @@
- `Array <http://www.boost.org/libs/array/>`_ : ``boost/array.hpp``, 改用 `std::array <http://en.cppreference.com/w/cpp/container/array>`_ - `Array <http://www.boost.org/libs/array/>`_ : ``boost/array.hpp``, 改用 `std::array <http://en.cppreference.com/w/cpp/container/array>`_
6.24. C++11 6.23. C++11
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
.. tip:: .. tip::