From ae358fa3171ee64f707b9f2b9f954b6959270b07 Mon Sep 17 00:00:00 2001 From: Jacob Zhong Date: Fri, 6 Sep 2019 10:45:39 -0400 Subject: [PATCH] Apply suggestions from code review Co-Authored-By: ouuan Co-Authored-By: Xeonacid --- docs/lang/c-cpp.md | 4 ++-- docs/lang/const.md | 8 +++++--- docs/lang/op.md | 2 +- docs/lang/reference.md | 2 +- mkdocs.yml | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/lang/c-cpp.md b/docs/lang/c-cpp.md index f0082dd2..d3182dd8 100644 --- a/docs/lang/c-cpp.md +++ b/docs/lang/c-cpp.md @@ -18,6 +18,6 @@ const 在 C 中只有限定变量不能修改的功能,而在 C++ 中,由于 ## 内存分配 -C++ 中新增了 new 和 delete 关键字用来在“自由存储区”上分配空间,这个自由存储区可以是堆也可以是静态存储区,他们是为了配合“类”而出现的。其中 `detele[]` 关键字还能够直接动态分配数组,非常方便。new 和 delete 关键字会调用类型的构造函数和析构函数,相比 C 中的 `malloc()` 、 `realloc()` 、 `free()` 函数,他们对类型有更完善的支持,但是效率也不如 C 中的这些函数。 +C++ 中新增了 `new` 和 `delete` 关键字用来在“自由存储区”上分配空间,这个自由存储区可以是堆也可以是静态存储区,他们是为了配合“类”而出现的。其中 `detele[]` 还能够直接释放动态数组的内存,非常方便。`new` 和 `delete` 关键字会调用类型的构造函数和析构函数,相比 C 中的 `malloc()` 、 `realloc()` 、 `free()` 函数,他们对类型有更完善的支持,但是效率不如 C 中的这些函数。 -简而言之,如果你需要动态分配内存的对象是基础类型或他们的数组,那么你可以使用 `malloc()` 进行更高效的内存分配;但如果你新建的对象是非基础的类型,那么建议使用 `new` 以获得安全性检查。值得注意的是尽管 new 和 `malloc()` 都能给返回指针,但是 new 出来的指针 **只能用 delete 回收** ,而 `malloc()` 出来的指针也只能用 `free()` 回收,否则会有内存泄漏的风险。 +简而言之,如果你需要动态分配内存的对象是基础类型或他们的数组,那么你可以使用 `malloc()` 进行更高效的内存分配;但如果你新建的对象是非基础的类型,那么建议使用 `new` 以获得安全性检查。值得注意的是尽管 `new` 和 `malloc()` 都是返回指针,但是 `new` 出来的指针 **只能** 用 `delete` 回收,而 `malloc()` 出来的指针也只能用 `free()` 回收,否则会有内存泄漏的风险。 diff --git a/docs/lang/const.md b/docs/lang/const.md index 6de9ff11..92d54ff5 100644 --- a/docs/lang/const.md +++ b/docs/lang/const.md @@ -53,7 +53,9 @@ int const* (*f4)(int); // 指向返回常指针的函数指针 int const* (*const f5)(int) = some_func; // 指向返回常指针的函数的常指针 ``` -我们把常类型指针又称 **底层指针** 、常指针变量又称 **顶层指针** 。另外,C++ 中还提供了 `const_cast` 运算符来强行去掉或者增加引用或指针类型的 const 限定,不到万不得已的时候请不要使用这个关键字。 +我们把常类型指针又称 **底层指针** 、常指针变量又称 **顶层指针** 。 + +另外,C++ 中还提供了 `const_cast` 运算符来强行去掉或者增加引用或指针类型的 const 限定,不到万不得已的时候请不要使用这个关键字。 ### 常参数 @@ -68,7 +70,7 @@ void sum(const std::vector &data, int &total) { ## 常成员 -常成员指的是类型中被 const 修饰的成员,常成员可以用来限制对常对象的修改。其中,常成员变量与常量声明相同,而常成员函数声明方法为 `void type::func(...) const` ,即在成员声明的 **末尾** 添加 const 修饰符。 +常成员指的是类型中被 const 修饰的成员,常成员可以用来限制对常对象的修改。其中,常成员变量与常量声明相同,而常成员函数声明方法为在成员函数声明的 **末尾** (参数列表的右括号的右边)添加 const 修饰符。 ```cpp // 常成员的例子 @@ -93,7 +95,7 @@ int s = c.size(); // vector::size() 是常成员,可以访问 ## 常表达式 constexpr(C++11) -constexpr 说明符的作用是声明可以在编译时求得函数或变量的值,它的行为和 C 语言中的 const 关键字是一致的,会将变量结果直接编译到栈空间中。constexpr 还可以用来替换宏定义的常量,规避 [宏定义的风险](./basic.md) 。constexpr 修饰的是变量和函数,而 const 修饰的是类型。 +constexpr 说明符的作用是声明可以在编译时求得函数或变量的值,它的行为和 C 语言中的 const 关键字是一致的,会将变量结果直接编译到栈空间中。constexpr 还可以用来替换宏定义的常量,规避 [宏定义的风险](./basic.md#define) 。constexpr 修饰的是变量和函数,而 const 修饰的是类型。 > 实际上把 const 理解成 **"readonly"** ,而把 constexpr 理解成 **"const"** 更加直观。 diff --git a/docs/lang/op.md b/docs/lang/op.md index 47f9e3ff..3d93b455 100644 --- a/docs/lang/op.md +++ b/docs/lang/op.md @@ -44,7 +44,7 @@ author: Ir1d, aofall 有时我们需要让变量进行增加 1(自增)或者减少 1(自减),这时自增运算符 `++` 和自减运算符 `--` 就派上用场了。 -自增/自减运算符可放在变量前或变量后面,在变量前称为前缀,在变量后称为后缀,单独使用时前缀后缀无需特别区别,如果用于赋值语句时则需注意,具体可看下面的例子。详细情况可参考 [引用](./reference.md) 介绍的例子部分。 +自增/自减运算符可放在变量前或变量后面,在变量前称为前缀,在变量后称为后缀,单独使用时前缀后缀无需特别区别,如果需要用到表达式的值则需注意,具体可看下面的例子。详细情况可参考 [引用](./reference.md) 介绍的例子部分。 ```cpp i = 100; diff --git a/docs/lang/reference.md b/docs/lang/reference.md index 03af51c1..a40e6641 100644 --- a/docs/lang/reference.md +++ b/docs/lang/reference.md @@ -1,6 +1,6 @@ 引用可以看成是 C++ 封装的指针,用来传递它所指向的对象。在 C++ 代码中实际上会经常和引用打交道,但是通常不会显式地表现出来。引用的基本原则是在声明时必须指向对象,以及对引用的一切操作都相当于对原对象操作。另外,引用不是对象,因此不存在引用的数组、无法获取引用的指针,也不存在引用的引用。 -> 尽管引用不是对象,但是通过 [ `reference_wrapper` ](https://zh.cppreference.com/w/cpp/utility/functional/reference_wrapper) 把它对象化,间接实现相似的效果。 +> 尽管引用不是对象,但是可以通过 [ `reference_wrapper` ](https://zh.cppreference.com/w/cpp/utility/functional/reference_wrapper) 把它对象化,间接实现相似的效果。 引用主要分为两种,左值引用和右值引用。此外还有两种特殊的引用:转发引用和垂悬引用,不作详细介绍。另外,本文还牵涉到一部分常值的内容,请用 [常值](./const.md) 一文辅助阅读。 diff --git a/mkdocs.yml b/mkdocs.yml index 15adb45d..bb48e103 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -87,7 +87,7 @@ nav: - pb_ds 简介: lang/pb-ds/index.md - 堆: lang/pb-ds/pq.md - 平衡树: lang/pb-ds/tree.md - - C 与 C++ 避坑: lang/c-cpp.md + - C 与 C++ 区别: lang/c-cpp.md - Pascal 转 C++ 急救: lang/pas-cpp.md - Python 速成: lang/python.md - Java 速成: lang/java.md -- 2.11.0