What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
cs:programming:cpp:boolan_cpp:oop_a_week2 [2024/01/14 13:46] – ↷ 页面programming:cpp:boolan_cpp:oop_a_week2被移动至cs:programming:cpp:boolan_cpp:oop_a_week2 codingharecs:programming:cpp:boolan_cpp:oop_a_week2 [2024/01/14 13:47] (当前版本) – ↷ 链接因页面移动而自动修正 codinghare
行 19: 行 19:
 </code> </code>
 \\ \\
-对于不带指针的类,系统会默认提供一个**按位拷贝**的复制操作来处理类成员之前可能发生的复制操作;这对于线性存储的数据结构来说是没有问题的。但是,如果我们在带指针的数据结构之间使用编译器自带的复制操作(上例),那么就有问题了:我们复制的其实是<wrap em>指向数据的指针</wrap>,而不是具体的数据;而这个结果会导致严重的问题(见[[programming:cpp:boolan_cpp:oop_a_week2#1.4.浅拷贝和深拷贝|1.4]])。+对于不带指针的类,系统会默认提供一个**按位拷贝**的复制操作来处理类成员之前可能发生的复制操作;这对于线性存储的数据结构来说是没有问题的。但是,如果我们在带指针的数据结构之间使用编译器自带的复制操作(上例),那么就有问题了:我们复制的其实是<wrap em>指向数据的指针</wrap>,而不是具体的数据;而这个结果会导致严重的问题(见[[cs:programming:cpp:boolan_cpp:oop_a_week2#1.4.浅拷贝和深拷贝|1.4]])。
 \\ \\
 \\ \\
行 111: 行 111:
 \\ \\
 \\ \\
-{{ programming:cpp:boolan_cpp:deepcopy.jpg?600 |}}+{{ cs:programming:cpp:boolan_cpp:deepcopy.jpg?600 |}}
 \\ \\
 \\ \\
-回到我们的程序,我们可以看到三个操作开头的([[programming:cpp:boolan_cpp:oop_a_week2|见1]])都涉及到了拷贝。假设 ''A'' 和 ''B'' 都是字符串,我们要将 ''B'' 的内容 拷贝给 ''A'',来看一看如果我们直接使用浅拷贝,会造成什么样的后果:+回到我们的程序,我们可以看到三个操作开头的([[cs:programming:cpp:boolan_cpp:oop_a_week2|见1]])都涉及到了拷贝。假设 ''A'' 和 ''B'' 都是字符串,我们要将 ''B'' 的内容 拷贝给 ''A'',来看一看如果我们直接使用浅拷贝,会造成什么样的后果:
 \\ \\
 \\ \\
行 138: 行 138:
 ===栈 Stack=== ===栈 Stack===
  
-栈是系统为调用函数所准备的空间。当函数被调用的时候,系统会自动在**栈顶**为被调用函数保留一个内存区域。这些内存区域主要存放**局部变量**,和一些 //Bookkeeping Data//(用于内存释放,调试等等,见 [[programming:cpp:boolan_cpp:oop_a_week2#2.5.VC 中堆的内存块结构|2.5]])。当函数结束调用时候,系统会自动回收这一部分内存。栈的内存分配策略是 //LIFO// (Last In First Out),也就是最近被调用的函数(**栈顶**的内存区)会被最先释放掉。+栈是系统为调用函数所准备的空间。当函数被调用的时候,系统会自动在**栈顶**为被调用函数保留一个内存区域。这些内存区域主要存放**局部变量**,和一些 //Bookkeeping Data//(用于内存释放,调试等等,见 [[cs:programming:cpp:boolan_cpp:oop_a_week2#2.5.VC 中堆的内存块结构|2.5]])。当函数结束调用时候,系统会自动回收这一部分内存。栈的内存分配策略是 //LIFO// (Last In First Out),也就是最近被调用的函数(**栈顶**的内存区)会被最先释放掉。
  
 ===堆 Heap=== ===堆 Heap===