虽然对类设计中的一些事实感到困惑,特别是函数是否应该是成员,但我查看了有效的c ++并找到了第23项,即将非成员非友元函数更喜欢成员函数.第一手阅读Web浏览器示例有一定意义,但是该示例中的便捷函数(在本书中命名为非成员函数)会改变类的状态,不是吗?
所以,第一个问题,他们不应该成为会员吗?
进一步阅读,他认为STL函数,实际上某些类没有实现的函数是在stl中实现的.继他们演变成被包装到一些合理的命名空间,如一些便利功能,这本书的想法std::sort,std::copy从algorithm.例如,vector类没有sort函数,并且使用stl sort函数,因此它不是向量类的成员.但是也可以将相同的推理延伸到向量类中的某些其他函数,例如,assign这样也不能作为成员实现,而是作为便利函数实现.但是,这也会改变对象的内部状态,例如它操作的排序.那么这个微妙但重要(我猜)问题背后的理由是什么呢?
如果你有权访问这本书,你可以为我澄清这些要点吗?
c++ encapsulation member-functions effective-c++ non-member-functions
我阅读了Scott Meyers 关于这个主题的文章,并对他所谈论的内容感到很困惑.我这里有3个问题.
问题1
为了详细说明,假设我写一个简单的vector<T>类等的方法push_back,insert和运营商[].如果我遵循Meyers的算法,我最终会得到所有非会员朋友的功能.我将有一个带有很少私有成员和许多非成员朋友函数的向量类.这是他在说什么?
问题2
我仍然不了解非成员函数如何改进封装.考虑一下迈耶斯文章中给出的代码.
class Point {
public:
int getXValue() const;
int getYValue() const;
void setXValue(int newXValue);
void setYValue(int newYValue);
private:
... // whatever...
};
Run Code Online (Sandbox Code Playgroud)
如果遵循他的算法,setXXXX方法应该是非成员.我的问题是如何增加封装?他还说
我们现在已经看到,衡量一个类中封装量的合理方法是计算在类的实现发生变化时可能会被破坏的函数数量.
直到我们在类实现发生变化时保持方法签名不变,没有客户端代码会被破坏并且封装得很好,对吧?这同样适用于非成员函数.那么非成员函数提供的优势是什么?
问题3
引用他的算法
else if (f needs type conversions
on its left-most argument)
{
make f a non-member function;
if (f needs access to non-public
members of C)
make f a friend of C;
}
Run Code Online (Sandbox Code Playgroud)
他的意思是f需要在最左边的参数上进行类型转换?他还在文章中说了以下内容. …