《深度探索C++对象模型》第五章,一段有关拷贝语义学的文字没看懂,请教各位大虾

celeil 2008-04-11 08:27:54
《深度探索C++对象模型》P223页有这么一段:
  编译器如何能够在Point3d和Vertex的copy assignment operators中压抑Point的copy assignment operators呢?编译器不能够重复传统的consructor解决方案(附上额外的参数)。这是因为,和constructor以及destructor不同的是,“取copy assignment operator地址”的操作是合法的。

背景说明,这里有个假设,有类Point3d和Vertex,都是虚拟继承自类Point。而类Vertex3d则同时继承自Point3d和Vertex。那么显然在Point3d和Vertex的copy assignment operator里都有调用Point的copy assignment operator这个动作,那么在Vertex3d里则会重复把这个动作做3次。为了不这样,编译器必须压抑在Vertex3d里的Point3d和Vertex的constructor不这么做。

我的问题:
  我的第一个问题是,这段话里的“传统的constructor解决方案(附上额外的参数)”是什么?我记得这本书里有讲,但不记得在何处了,请知道的朋友告诉俺。
  我的第二个问题是,下一句,“取copy assignment operator地址”的操作是合法的,这句话何解?在书中接着举了个例子,用一个函数指针调用Point3d的copy assignment operator,是不是怕程序员进行这种调用,从而会破坏在Vertex3d中对Point3d的copy assignment operator的压抑动作?
...全文
193 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hastings 2008-04-12
  • 打赏
  • 举报
回复
书接下去还提到了很多,还有一些建议.
unique_man 2008-04-12
  • 打赏
  • 举报
回复
兄弟,看书上的212页.
1.__most_derived这个参数就是传统的constructor的解决方案,在Vertex3d中调用父类的构造的时候,此值为false,压抑了父类的构造。
2.这个我也没看懂,不知道为什么取构造函数的地址是非法的。不过取operator=的地址确实是合法的,按照书上p223的写法,完全可以调用.可能是因为构造函数不能取地址,所以编译器才能做手脚吧。
hityct1 2008-04-12
  • 打赏
  • 举报
回复
ding
baihacker 2008-04-11
  • 打赏
  • 举报
回复
刚看了一下,就是在证明对于构造函数的四种扩张这种解决方案的必要性和默认operator=实现的复杂性(就是你指出的这一段开始说明复杂性)。
baihacker 2008-04-11
  • 打赏
  • 举报
回复
1.第四十一页第一段,第四十五页中下,第四十七页的总结
celeil 2008-04-11
  • 打赏
  • 举报
回复
不好意思,我想您误会我的意思了,我不是问编译器扩展constructor的方案,而是“压抑constructor”的方案。他这段话是说,压抑copy assignment operator的方法,与传统的压抑constructor的方法不同。我记得书上有聊到对constructor,尤其是copy constructor的压抑方案,但一时半会儿找不着在书中的哪儿讲的了,所以想请教一下。我认为我对书中这段话的不理解,缘于我对constructor的压抑方案记忆不清,所以根书上的这段话连不起来,故而看不懂。
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-11 08:27
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下