作者回复: 没关系。我打赌你看的时间肯定没我写稿的时间长。😁
作者回复: 谢谢。
《Professional C++》之前没看过,扫了两眼,觉得内容不错,推荐。内容还挺多挺深的,适合决心在 C++ 上深入的同学。
作者回复: 3. 赋值需要一个对象(不是引用),因而在进入执行前就要引发一个构造。没有合适的构造函数可用。
4. 同样,要先构造。这回可以用右值引用的构造函数了。
作者回复: 嘻嘻,我在偷偷地塞进C++11的语法。对象初始化可以统一用大括号。(小括号这儿也行。)
作者回复: 特别有困难的点可以提出。大部分概念的引入我应该都是有解释的。
作者回复: 这是一个很特殊的、甚至有点恼人的情况。如果没有非泛型版本,编译器看到没有拷贝构造函数,会生成一个缺省的拷贝构造函数。这样,同样类型的smart_ptr的拷贝构造会是错误的。“子类指针向基类指针的转换”这一节里我也提到了这点。这不是我讲智能指针想讲的内容,所以就淡化了。
作者回复: 多谢抓虫。正文已更新。
这也证明了,修改代码、没有完整测试,是极易招虫的啊……
作者回复: 一遍看不懂,就再看一遍。所有的代码自己试验一下。😀
学习无捷径。掌握 C++ 不是 30 个课时能解决的事情。一万小时理论对于任何复杂领域都是基本适用的。
作者回复: 希望是难,但还能看得下去。哈哈。
作者回复: 移进去的话,smart_ptr<circle>::shared_count 和 smart_ptr<shape>::shared_count 成了两个完全不相关的类型,它们的指针(在不做强制类型转换时)也不能互相赋值,不好。
作者回复: 如果你搞不清,那多半就是不该返回引用的情况。下面会讲到这个话题。简单来说,大部分情况下,应该直接返回对象值。
作者回复: 是,一般情况下是。但没人阻挡你写 new shared_ptr…。
被管理的对象不会在栈上。只能是堆或者你的内存管理器使用的特殊区域。
目前的推荐是不要使用裸指针。使用值,或者智能指针。
作者回复: 很全。有几个小问题哈(像reset有几个重载不算😄):
获取原始指针的 get 方法我提供了;
* 和 -> 代码里是提供的;
引用计数器值也是有的。
实践层面,最大的区别,除了不支持弱引用外,可能是不支持自定义删除器了。
作者回复: 对。
另外额外加一点,调用移动不一定靠 move。如果函数返回一个 unique_ptr 一样是自然的移动。
作者回复: 嗯,是的。你是最早想起指针还有这些操作的。😁
作者回复: 第一周一次性放三讲。后面每周更新三次,一次一讲。
作者回复: 应该的。但我们还没学到通用的C++并发编程呢。
作者回复: 比如,如果你把这个指针传给另外一个函数,参数类型是smart_ptr,等函数返回,这个对象就消失了……
作者回复: 没错,相关的知识点很多,一定要多实践才行。
不过,回过头来看,我觉得我拿智能指针开头,难度可能是有点设高了。哈哈。
作者回复: 我知道、能想得起的参考资料肯定会贴出来。毕竟,三十讲的时间肯定是不够的。大家一定要阅读更多的资料才行。