我想知道哪类成员访问friend
函数和static
成员函数对类对象有什么作用。具体来说,差异是什么以及为什么使用一个而不是另一个。我的理解是,声明为类的friend
或static
成员的函数都可以访问该类的任何实例的私有成员。
我将举一个简单的例子,说明为什么它们看起来和我很相似。函数operator<
和MyClass::lessThan
似乎都具有相同的访问权限,并且可以执行完全相同的操作。
class MyClass {
friend bool operator<(const MyClass &left, const MyClass &right);
public:
MyClass(int pub, int priv) : m_pub(pub), m_priv(priv) {}
static bool lessThan(const MyClass &left, const MyClass &right);
int m_pub;
private:
int m_priv;
};
bool operator<(const MyClass &left, const MyClass &right) {
return ( (left.m_pub < right.m_pub) && (left.m_priv < right.m_priv) );
}
bool MyClass::lessThan(const MyClass &left, const MyClass &right) {
return ( (left.m_pub < right.m_pub) && (left.m_priv < right.m_priv) );
}
int main(int argc, const char* argv[]) {
MyClass a(1, 2),
b(3, 4),
c(-1, 1);
cout << "a < b = " << (a<b) << endl;
cout << "a lessThan b = " << MyClass::lessThan(a,b) << endl;
cout << "a < c = " << (a<c) << endl;
cout << "a lessThan c = " << MyClass::lessThan(a,c) << endl;
}
显然这是一个简化的例子,但我想我的问题是两部分的:
答案 0 :(得分:2)
请记住,虽然朋友函数的原型出现在类定义中,但朋友函数不是函数成员。类的朋友函数远离类定义,但朋友函数可以访问非公共成员。有些人认为“友谊”会破坏信息隐藏。有时朋友函数用于制作测试人员类。
当对象类应该只共享变量的一个副本时,使用静态数据成员。因此,当只有一个副本足以供所有类成员使用时,必须使用静态数据成员来保存存储空间。
对于静态成员函数,您可以查看以下内容:When to use static member function?
答案 1 :(得分:1)
它们是不同的概念:
如果类,方法或函数是类X的朋友,那么该类,函数或方法可以访问被声明为私有的类X的成员,因此通常无法在类外部访问
class A{
private:
int x;
friend void foo(A& a);
};
void foo(A& a){
a.x = 3; //Access okay, foo is a friend of A
}
void bar(A& a){
a.x = -1; // Compiler will complain A::x is private
}
静态成员是在该类的所有对象实例之间共享的数据成员,或者是在没有该类的实例对象的情况下可以调用的方法。
class B{
private:
static int y;
public:
static void printY();
void alterY();
}
int B::y=3;
void B::printY(){
cout<<y;
}
void B::alterY(){
y++;
cout<<y;
}
B b1,b2;
B::printY();// will output 3
b1.alterY();// will output 4
b2.alterY();// will output 5
答案 2 :(得分:1)
静态方法可以在不经过类实例的情况下调用,因此它们不具有任何直接访问权限,它们就像全局函数,但嵌套在类的命名空间中。但是,如果你给它们一个该类的实例作为参数,他们将能够访问成员变量,而不像非静态方法那样通过访问器。像静态方法一样,如果你给朋友们提供他们所熟悉的类的实例作为参数,他们将能够直接访问成员变量。
答案 3 :(得分:1)
答案 4 :(得分:0)
关于成员访问的朋友和静态函数有什么区别?
无。他们都是完全访问权限。
在决定使用哪种东西时应考虑哪些事项?
它完全取决于上下文以及使代码更易于阅读的原因。
在上面的示例中,我肯定更喜欢bool operator<()
而不是MyClass::lessThan()
,因为它使代码更易于阅读。