【发布时间】:2015-11-24 18:00:48
【问题描述】:
当我阅读https://isocpp.org/wiki/faq/ctors#empty-parens-in-object-decl 的帖子时,它有一个示例代码。
class MyString {
public:
MyString(const MyString& s); // copy constructor
// ...
protected:
unsigned len_; // ORDER DEPENDENCY
char* data_; // ORDER DEPENDENCY
};
MyString::MyString(const MyString& s)
: len_ (s.len_)
, data_(new char[s.len_ + 1u])
{ ↑↑↑↑↑↑ // not len_
memcpy(data_, s.data_, len_ + 1u);
} ↑↑↑↑ // no issue using len_ in ctor's {body}
在Is it moral for one member object to be initialized using another member object in the initializer expression?和What if one member object has to be initialized using another member object?的小节部分,它说:
"在构造函数的初始化列表中,避免在该对象的后续初始化程序的初始化表达式中使用来自该对象的一个成员对象是最简单和最安全的。因为这个准则,后面的构造函数使用 s.len_ + 1u 而不是 len_ + 1u,即使它们在其他方面是等价的。s. 前缀避免了不必要的和可避免的顺序依赖。”
s.len_ 和len_ 是等价的? s.len_指的是s的len_,但len_指的是this;在我几天前why copy constructor use private property directly in C++ 提出的问题中,LogicStuff 说访问 s.len_ 有效,因为它适应了const 实例。这两个答案似乎无关。
s. 前缀避免了不必要的和可避免的顺序依赖?任何人都可以详细解释这种情况下的订单依赖性吗?
【问题讨论】:
标签: c++ coding-style