Re: [问题] 使用指标的时机

楼主: tinlans ( )   2019-09-13 09:18:05
※ 引述《PythonScript (Python)》之铭言:
: 拍谢 问问题果然还是要有技巧 0rz
: 贴 sample code 可能比较好
: https://pastebin.com/HhrqvaAz
: 我原本要问的问题就是 sample code 中的
: instanceA, instanceB, instanceAPointer, instanceBPointer
: 会不会有机会消失
所有区域变量离开它的 scope 后都会消失,但是你想听的答案大概不是这个。
18 行的 instanceA 在 20 行 return instanceA 后就会消失。
createInstanceA() 传回的是 instanceA 的复本,它已经不是 instanceA。
30 和 38 行的 instanceB 同理。
25 行的 instanceAPointer 是一个内部存放内存位址的变量,俗称为 pointer。
在 26 行 return instanceAPointer 后就会消失。
createInstanceAPointer() 传回的是 instanceAPointer 的复本,
它已经不是原本的 instanceAPointer。
45 行和 52 行的 instanceBPointer 也是同理。
不过你想听的大概不是这个,而是 25 行 new classA 造出来的 instance 是否还存在。
在 C++ 里 new 出来的东西没 delete 就是会一直存在,
只是没有 pointer 指到它的话,你就没办法 delete 它。
: (**问题1)
: 主要操作的对象是 instanceB, 会担心 instanceB 身上挂的 instanceA 会消失
: 因为一直看到 C++ 的内存有可能会被取代, 所以要用指标 (还是这是我的误解?)
我不清楚“C++ 的内存有可能会被取代”这一概念你是如何获得的。
或许你需要好好说明一下。
总而言之这个说法非常奇怪,奇怪到我想知道你为什么会有这种认知。
: 后来发现编译不会过, 有点惊呆了
: 错误是写发生在 Line 33
: Error C4700 uninitialized local variable 'instanceB' used
这照理说只是 warning,只是你开启了将 warning 视为 error 的编译选项。
: (**问题2)
: 所以 classB instanceB; 还是得初始化才行吗
: 这就是板友说的有可能会无效?
class instanceB 是已经初始化了,classB 的 constructor 会被唤起。
只是因为你没写,使用了编译器产生的 default constructor,
所以内部是 primitive data type 的 data members 都没有初始化到。
32 行你替 PropertOfInstanceA 设了值,但 PropertOfInstanceAPointer 没设,
可是你却打算替这样的 instanceB 制作复本,所以编译器警告了这件事。
: (**问题3)
: 这样看起来 C++ 也跟 C# 一样, 必须要初始化才能用
这是你的误解。
: 看过一些 C++ code, 都是没 new 就直接用了
: 请问为什么我会有这种错觉 @@
C# 有分 value type 和 reference type,使用上的语法几乎没分别。
C++ 的 data type 标 * 才是 pointer,标 & 才是 reference,其它都是 value type。
* 和 & 有时会被 using 或 typedef 藏起来,不过本质还是一样的。
如果你不知道 C# 有这特性,你可能得先复习一下你原本熟的 C#。
至少要能区分这两种东西,还有它们背后的原理,包括 stack 和 heap 上各有什么。
: 还是因为使用情况不同, 所以可以不用初始化就拿来用
: 再看回 sample, 下面这个比较早先出, 为什么编译器没有显示这个错误
: Line 17
: classA createInstanceA()
: {
: classA instanceA;
: return instanceA;
: };
因为你的 classA 没有 data member,理由前面讲了。
: (**问题4)
: 是因为 Line33 那一块有执行
: instanceB.PropertOfInstanceA = passedInstanceA;
: 的关系吗
不是,反而是你还缺了帮 instanceB.PropertOfInstanceAPointer 设值的那行。
: (**问题5)
: 那这样的话, sample code 里面的 instanceB
: 通通都得用 instanceBPointer 才能操作囉
因为并不是这样,所以这问题就不回了。
: 拍谢 问一问都觉得自己是白痴, 我也很想有时间学跟有同事能问 0rz
我也知道在工作以后很难有时间好好学东西,但你还是得排出时间好好学。
你看起来是想依靠 C# 的知识无痛切换到 C++,结果踢到了铁板。
世界上没有这么美好的事,你想这样做还是得先彻底了解 C# 跟 C++ 的差异才行。
如果找不到详述这些差异的学习资源,这可能比你从零开始学 C++ 还要痛。
这方面就看你的本事了,或者看看板友有没有学习资源可以提供给你。
作者: PythonScript (Python)   2019-09-13 09:38:00
感谢详尽的回复 会好好查这些说明的内容

Links booklink

Contact Us: admin [ a t ] ucptt.com