当我们希望它访问该类的私有成员时,我们将非成员函数作为类的朋友.这赋予它与静态成员函数相同的访问权限.两种选择都会为您提供一个与该类的任何实例无关的函数.
什么时候必须使用朋友功能?什么时候必须使用静态函数?如果两者都是解决问题的可行方案,那么我们如何权衡它们的适用性呢?是否有一个默认情况下应该首选?
例如,当实现一个工厂创建foo只有私有构造函数的类的实例时,工厂函数应该是foo(你会调用foo::create())的静态成员还是应该是友元函数(你会调用create_foo())?
我的类定义分布在头文件和源文件中:
// T.hpp
class T {
public:
void foo();
};
// T.cpp
void T::foo() {
}
Run Code Online (Sandbox Code Playgroud)
如果T::foo需要使用一些只T需要可见的辅助函数,以下哪种解决方案最好?
// T.hpp
class T {
public:
void foo();
private:
void helper();
};
// T.cpp
void T::foo() {
helper();
}
void T::helper() {
}
Run Code Online (Sandbox Code Playgroud)
// T.hpp
class T {
public:
void foo();
};
// T.cpp
namespace {
void helper() {}
}
void T::foo() {
helper();
}
Run Code Online (Sandbox Code Playgroud)
有没有区别,除了前者我会在头文件中有更多的功能?
在Bjarne Stroustrup撰写的The C++ Programming Language一书中,作者介绍了一个必须实现函数inv()的类Matrix.在第11.5.1节中,他谈到了这样做的两种可能性.一个是建立一个成员函数,另一个是使朋友函数inv().然后在第11.5.2节结束时,他谈到选择是否使用朋友或成员函数,他说:
如果inv()确实反转了Matrix m本身,而不是返回一个与m相反的新Matrix,那么它应该是一个成员.
为什么会这样?朋友函数不能改变Matrix的状态并返回对该矩阵的引用吗?是因为在调用函数时传递临时矩阵的可能性是什么?
怎么可能用来 operator<<推进strings vector.我搜索了很多,但只找到流示例.
class CStringData
{
vector< string > myData;
// ...
// inline operator << ... ???
};
Run Code Online (Sandbox Code Playgroud)
我希望这可以用作一个简单的省略(类似void AddData(...))交换来获得健壮的参数.
CStringData abc;
abc << "Hello" << "World";
Run Code Online (Sandbox Code Playgroud)
这有可能吗?