作者回复: 没关系。我打赌你看的时间肯定没我写稿的时间长。😁
作者回复: 谢谢。
《Professional C++》之前没看过,扫了两眼,觉得内容不错,推荐。内容还挺多挺深的,适合决心在 C++ 上深入的同学。
作者回复: 3. 赋值需要一个对象(不是引用),因而在进入执行前就要引发一个构造。没有合适的构造函数可用。
4. 同样,要先构造。这回可以用右值引用的构造函数了。
作者回复: 嘻嘻,我在偷偷地塞进C++11的语法。对象初始化可以统一用大括号。(小括号这儿也行。)
作者回复: 特别有困难的点可以提出。大部分概念的引入我应该都是有解释的。
作者回复: 多谢抓虫。正文已更新。
这也证明了,修改代码、没有完整测试,是极易招虫的啊……
作者回复: 一遍看不懂,就再看一遍。所有的代码自己试验一下。😀
学习无捷径。掌握 C++ 不是 30 个课时能解决的事情。一万小时理论对于任何复杂领域都是基本适用的。
作者回复: 希望是难,但还能看得下去。哈哈。
作者回复: 如果你搞不清,那多半就是不该返回引用的情况。下面会讲到这个话题。简单来说,大部分情况下,应该直接返回对象值。
作者回复: 这是一个很特殊的、甚至有点恼人的情况。如果没有非泛型版本,编译器看到没有拷贝构造函数,会生成一个缺省的拷贝构造函数。这样,同样类型的smart_ptr的拷贝构造会是错误的。“子类指针向基类指针的转换”这一节里我也提到了这点。这不是我讲智能指针想讲的内容,所以就淡化了。
作者回复: 第一周一次性放三讲。后面每周更新三次,一次一讲。
作者回复: 应该的。但我们还没学到通用的C++并发编程呢。
作者回复: 没错,相关的知识点很多,一定要多实践才行。
不过,回过头来看,我觉得我拿智能指针开头,难度可能是有点设高了。哈哈。
作者回复: 我知道、能想得起的参考资料肯定会贴出来。毕竟,三十讲的时间肯定是不够的。大家一定要阅读更多的资料才行。
作者回复: 哈哈,对。
作者回复: 移进去的话,smart_ptr<circle>::shared_count 和 smart_ptr<shape>::shared_count 成了两个完全不相关的类型,它们的指针(在不做强制类型转换时)也不能互相赋值,不好。
作者回复: 这个实现不支持。需要写更多的代码。
C++17 的 shared_ptr 可以支持这样的写法,但也得明确告诉编译器是数组:
std::shared_ptr<int[]> ptr1{new int[5]};
auto ptr2 = std::shared_ptr<int[]>{new int[5]};
C++20 进一步支持:
auto ptr3 = std::make_shared<int[]>(5);
另外,new int[5] 之后用 delete 是不对(好)的。这儿一般还不会出问题,如果是带析构的对象就一定会出问题的。new …[] 之后一定用 delete[] …。
作者回复: 不是。再想想。按你的写法,this指向的对象就被传到rhs来拥有了。这不是=希望做的事情。
作者回复: 比如,你的对象有两个成员,管理着两个对象,如果你在拷贝赋值时逐个地复制另外一个对象的相应的两个成员对象,在复制第二个时发生了异常,那 this 对象就处于一个奇怪的状态:既没成功完成复制,也没有了原先的对象。
作者回复: 现在一般说拷贝赋值和移动赋值了。跟构造的不同方式对应。