mirror of
https://github.com/zh-google-styleguide/zh-google-styleguide.git
synced 2024-10-22 20:10:08 +08:00
Merge pull request #160 from Mq-b/remove-reference-parameter
删除 `4.3.` 与 `6.1.` 引用参数的内容
This commit is contained in:
commit
c3a562c1df
@ -35,46 +35,7 @@ C/C++ 中的函数参数或者是函数的输入, 或者是函数的输出, 或
|
||||
|
||||
在处理代码时, 你可能会发现复杂的长函数. 不要害怕修改现有代码: 如果证实这些代码使用 / 调试起来很困难, 或者你只需要使用其中的一小段代码, 考虑将其分割为更加简短并易于管理的若干函数.
|
||||
|
||||
4.3. 引用参数
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**总述**
|
||||
|
||||
所有按引用传递的参数必须加上 ``const``.
|
||||
|
||||
**定义**
|
||||
|
||||
在 C 语言中, 如果函数需要修改变量的值, 参数必须为指针, 如 ``int foo(int *pval)``. 在 C++ 中, 函数还可以声明为引用参数: ``int foo(int &val)``.
|
||||
|
||||
**优点**
|
||||
|
||||
定义引用参数可以防止出现 ``(*pval)++`` 这样丑陋的代码. 引用参数对于拷贝构造函数这样的应用也是必需的. 同时也更明确地不接受空指针.
|
||||
|
||||
**缺点**
|
||||
|
||||
容易引起误解, 因为引用在语法上是值变量却拥有指针的语义.
|
||||
|
||||
**结论**
|
||||
|
||||
函数参数列表中, 所有引用参数都必须是 ``const``:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
void Foo(const string &in, string *out);
|
||||
|
||||
事实上这在 Google Code 是一个硬性约定: 输入参数是值参或 ``const`` 引用, 输出参数为指针. 输入参数可以是 ``const`` 指针, 但决不能是非 ``const`` 的引用参数, 除非特殊要求, 比如 ``swap()``.
|
||||
|
||||
有时候, 在输入形参中用 ``const T*`` 指针比 ``const T&`` 更明智. 比如:
|
||||
|
||||
* 可能会传递空指针.
|
||||
|
||||
* 函数要把指针或对地址的引用赋值给输入形参.
|
||||
|
||||
总而言之, 大多时候输入形参往往是 ``const T&``. 若用 ``const T*`` 则说明输入另有处理. 所以若要使用 ``const T*``, 则应给出相应的理由, 否则会使得读者感到迷惑.
|
||||
|
||||
.. _function-overloading:
|
||||
|
||||
4.4. 函数重载
|
||||
4.3. 函数重载
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**总述**
|
||||
@ -105,7 +66,7 @@ C/C++ 中的函数参数或者是函数的输入, 或者是函数的输出, 或
|
||||
|
||||
如果打算重载一个函数, 可以试试改在函数名里加上参数信息. 例如, 用 ``AppendString()`` 和 ``AppendInt()`` 等, 而不是一口气重载多个 ``Append()``. 如果重载函数的目的是为了支持不同数量的同一类型参数, 则优先考虑使用 ``std::vector`` 以便使用者可以用 :ref:`列表初始化 <braced-initializer-list>` 指定参数.
|
||||
|
||||
4.5. 缺省参数
|
||||
4.4. 缺省参数
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**总述**
|
||||
@ -132,7 +93,7 @@ C/C++ 中的函数参数或者是函数的输入, 或者是函数的输出, 或
|
||||
|
||||
在其他情况下, 如果缺省参数对可读性的提升远远超过了以上提及的缺点的话, 可以使用缺省参数. 如果仍有疑惑, 就使用函数重载.
|
||||
|
||||
4.6. 函数返回类型后置语法
|
||||
4.5. 函数返回类型后置语法
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**总述**
|
||||
|
@ -1,43 +1,7 @@
|
||||
6. 其他 C++ 特性
|
||||
----------------------------
|
||||
|
||||
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. 右值引用
|
||||
6.1. 右值引用
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -70,7 +34,7 @@
|
||||
|
||||
.. _function-overloading:
|
||||
|
||||
6.3. 函数重载
|
||||
6.2. 函数重载
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -101,7 +65,7 @@
|
||||
|
||||
如果您打算重载一个函数, 可以试试改在函数名里加上参数信息。例如,用 ``AppendString()`` 和 ``AppendInt()`` 等, 而不是一口气重载多个 ``Append()``.
|
||||
|
||||
6.4. 缺省参数
|
||||
6.3. 缺省参数
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -134,7 +98,7 @@
|
||||
const AlphaNum &c = gEmptyAlphaNum,
|
||||
const AlphaNum &d = gEmptyAlphaNum);
|
||||
|
||||
6.5. 变长数组和 alloca()
|
||||
6.4. 变长数组和 alloca()
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -153,7 +117,7 @@
|
||||
|
||||
改用更安全的分配器(allocator),就像 ``std::vector`` 或 ``std::unique_ptr<T[]>``.
|
||||
|
||||
6.6. 友元
|
||||
6.5. 友元
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -166,7 +130,7 @@
|
||||
|
||||
.. _exceptions:
|
||||
|
||||
6.7. 异常
|
||||
6.6. 异常
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -211,7 +175,7 @@
|
||||
|
||||
.. _RTTI:
|
||||
|
||||
6.8. 运行时类型识别
|
||||
6.7. 运行时类型识别
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
TODO
|
||||
|
||||
@ -272,7 +236,7 @@
|
||||
|
||||
不要去手工实现一个类似 RTTI 的方案. 反对 RTTI 的理由同样适用于这些方案, 比如带类型标签的类继承体系. 而且, 这些方案会掩盖你的真实意图.
|
||||
|
||||
6.9. 类型转换
|
||||
6.8. 类型转换
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -303,7 +267,7 @@
|
||||
|
||||
.. _streams:
|
||||
|
||||
6.10. 流
|
||||
6.9. 流
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -356,7 +320,7 @@
|
||||
|
||||
每一种方式都是各有利弊, "没有最好, 只有更适合". 简单性原则告诫我们必须从中选择其一, 最后大多数决定采用 ``printf + read/write``.
|
||||
|
||||
6.11. 前置自增和自减
|
||||
6.10. 前置自增和自减
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -379,7 +343,7 @@
|
||||
|
||||
对简单数值 (非对象), 两种都无所谓. 对迭代器和模板类型, 使用前置自增 (自减).
|
||||
|
||||
6.12. ``const`` 用法
|
||||
6.11. ``const`` 用法
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -416,7 +380,7 @@
|
||||
|
||||
这是说, 我们提倡但不强制 ``const`` 在前. 但要保持代码的一致性! (Yang.Y 注: 也就是不要在一些地方把 ``const`` 写在类型前面, 在其他地方又写在后面, 确定一种写法, 然后保持一致.)
|
||||
|
||||
6.13. ``constexpr`` 用法
|
||||
6.12. ``constexpr`` 用法
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -439,7 +403,7 @@
|
||||
|
||||
靠 constexpr 特性,方才实现了 C++ 在接口上打造真正常量机制的可能。好好用 constexpr 来定义真・常量以及支持常量的函数。避免复杂的函数定义,以使其能够与constexpr一起使用。 千万别痴心妄想地想靠 constexpr 来强制代码「内联」。
|
||||
|
||||
6.14. 整型
|
||||
6.13. 整型
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -484,7 +448,7 @@
|
||||
|
||||
因此, 使用断言来指出变量为非负数, 而不是使用无符号型!
|
||||
|
||||
6.15. 64 位下的可移植性
|
||||
6.14. 64 位下的可移植性
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -546,7 +510,7 @@
|
||||
|
||||
.. _preprocessor-macros:
|
||||
|
||||
6.16. 预处理宏
|
||||
6.15. 预处理宏
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -567,7 +531,7 @@
|
||||
- 不要试图使用展开后会导致 C++ 构造不稳定的宏, 不然也至少要附上文档说明其行为.
|
||||
- 不要用 ``##`` 处理函数,类和变量的名字。
|
||||
|
||||
6.17. 0, ``nullptr`` 和 ``NULL``
|
||||
6.16. 0, ``nullptr`` 和 ``NULL``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -580,7 +544,7 @@
|
||||
|
||||
字符 (串) 用 ``'\0'``, 不仅类型正确而且可读性好.
|
||||
|
||||
6.18. sizeof
|
||||
6.17. sizeof
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -606,7 +570,7 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
6.19. auto
|
||||
6.18. auto
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -679,7 +643,7 @@
|
||||
|
||||
.. _braced-initializer-list:
|
||||
|
||||
6.20. 列表初始化
|
||||
6.19. 列表初始化
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -769,7 +733,7 @@
|
||||
|
||||
.. _lambda-expressions:
|
||||
|
||||
6.21. Lambda 表达式
|
||||
6.20. Lambda 表达式
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -807,7 +771,7 @@
|
||||
|
||||
.. _template-metaprogramming:
|
||||
|
||||
6.22. 模板编程
|
||||
6.21. 模板编程
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
.. tip::
|
||||
不要使用复杂的模板编程
|
||||
@ -838,7 +802,7 @@
|
||||
|
||||
.. _boost:
|
||||
|
||||
6.23. Boost 库
|
||||
6.22. Boost 库
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. tip::
|
||||
@ -891,7 +855,7 @@
|
||||
|
||||
- `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::
|
||||
|
Loading…
Reference in New Issue
Block a user