From b2059f1a48296cbe794cd0162a015f58d5dad89a Mon Sep 17 00:00:00 2001 From: Menghui Xie Date: Wed, 20 Jun 2018 15:31:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20union=20=E8=81=94=E5=90=88?= =?UTF-8?q?=E3=80=81enum=20=E6=9E=9A=E4=B8=BE=E3=80=81=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=20new?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d44f07b..0bbe348 100644 --- a/README.md +++ b/README.md @@ -357,6 +357,57 @@ int main() { 1. 默认的继承访问权限。struct 是 public 的,class 是 private 的。 2. struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。 +### union 联合 + +联合(union)是一种节省空间的特殊的类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。联合有如下特点: + +* 默认访问控制符为 public +* 可以含有构造函数、析构函数 +* 不能含有引用类型的成员 +* 不能继承自其他类,不能作为基类 +* 不能含有虚函数 +* 匿名 union 在定义所在作用域可直接访问 union 成员 +* 匿名 union 不能包含 protected 成员或 private 成员 +* 全局匿名联合必须是静态(static)的 + +
union 使用 + +```cpp +#include + +union UnionTest { + UnionTest() : i(10) {}; + int i; + double d; +}; + +static union { + int i; + double d; +}; + +int main() { + UnionTest u; + + union { + int i; + double d; + }; + + std::cout << u.i << std::endl; // 输出 UnionTest 联合的 10 + + ::i = 20; + std::cout << ::i << std::endl; // 输出全局静态匿名联合的 20 + + i = 30; + std::cout << i << std::endl; // 输出局部匿名联合的 30 + + return 0; +} +``` + +
+ ### C 实现 C++ 类 [C 语言实现封装、继承和多态](http://dongxicheng.org/cpp/ooc/) @@ -489,17 +540,17 @@ cout << x << endl;
:: 使用 ```cpp -int count = 0; // 全局(::)的 count +int count = 0; // 全局(::)的 count class A { public: - static int count; // 类 A 的 count(A::count) + static int count; // 类 A 的 count(A::count) }; int main() { ::count = 1; // 设置全局的 count 的值为 1 - A::count = 2; // 设置类 A 的 count 为 2 + A::count = 2; // 设置类 A 的 count 为 2 int count = 0; // 局部的 count count = 3; // 设置局部的 count 的值为 3 @@ -510,6 +561,21 @@ int main() {
+### enum 枚举类型 + +#### 限定作用域的枚举类型 + +```cpp +enum class open_modes { input, output, append }; +``` + +#### 不限定作用域的枚举类型 + +```cpp +enum color { red, yellow, green }; +enum { floatPrec = 6, doublePrec = 10 }; +``` + ### 引用 #### 左值引用 @@ -818,7 +884,7 @@ p = nullptr; #### new、delete -1. new/new[]:完成两件事,先底层调用 malloc 分了配内存,然后调用构造函数(创建对象)。 +1. new / new[]:完成两件事,先底层调用 malloc 分了配内存,然后调用构造函数(创建对象)。 2. delete/delete[]:也完成两件事,先调用析构函数(清理资源),然后底层调用 free 释放空间。 3. new 在申请内存时会自动计算所需字节数,而 malloc 则需我们自己输入申请内存空间的字节数。 @@ -837,6 +903,20 @@ int main() +#### 定位 new + +定位 new(placement new)允许我们向 new 传递额外的参数。 + +```cpp +new (palce_address) type +new (palce_address) type (initializers) +new (palce_address) type [size] +new (palce_address) type [size] { braced initializer list } +``` + +* `palce_address` 是个指针 +* `initializers` 提供一个(可能为空的)以逗号分隔的初始值列表 + ### delete this 合法吗? [Is it legal (and moral) for a member function to say delete this?](https://isocpp.org/wiki/faq/freestore-mgmt#delete-this)