C++入门——60s从0到1
友元
在C++中,友元是一种特殊的机制,它允许一个类或函数访问另一个类中的私有成员。友元可以公开一个类的接口,以便其他代码可以访问类的私有成员。
友元的概念
友元是一种特殊的机制,它允许一个类或函数访问另一个类中的私有成员。在C++中,类中的私有成员默认是只允许在类的内部访问的。如果其他代码需要访问这些成员,可以通过将它们声明为友元来实现。友元可以公开一个类的接口,以便其他代码可以访问类的私有成员。
友元的声明
在C++中,友元可以在类定义中进行声明。语法如下:
class MyClass {
friend class OtherClass; // 声明 OtherClass 为 MyClass 的友元类
friend void foo(); // 声明 foo() 为 MyClass 的友元函数
int x, y; // 其他成员变量和函数...
};
在此示例中,声明了一个友元类`OtherClass`和一个友元函数`foo()`。这些友元类和友元函数可以访问`MyClass`中的私有成员。
友元的使用
友元可以用于访问类的私有成员,它们通常被用于以下场景:
1. 访问私有成员:通过将其他代码声明为友元,可以使其访问类的私有成员。这可以帮助我们更好地封装代码,同时提供必要的接口以供其他代码使用。
2. 提供接口:通过将其他代码声明为友元,可以为其提供访问类接口的权限。这可以帮助我们更好地封装代码,并提供必要的接口以供其他代码使用。
3. 实现特定的操作:通过将其他代码声明为友元,可以为它们提供对特定操作的权限。这可以帮助我们更好地封装代码,并提供特定的功能以供其他代码使用。
友元函数的使用
友元函数是一种特殊的函数,它可以访问类的私有成员。通常情况下,我们需要在类外部定义一个函数来实现特定的操作,并将该函数声明为该类的友元函数。下面是一个示例:
class MyClass { private: int x, y; // 私有成员变量 public: void print() { cout << "x = " << x << ", y = " << y << endl; } friend void print(MyClass&); // 将 print() 声明为 MyClass 的友元函数 }; void print(MyClass& obj) { // 在函数定义中可以直接访问类的私有成员 cout << "x = " << obj.x << ", y = " << obj.y << endl; }
在此示例中,我们在类`MyClass`中定义了一个私有成员变量`x`和`y`,并将其公开在一个名为`print()`的公有成员函数中。我们还定义了一个名为`print()`的友元函数,它接受一个`MyClass`类型的参数对象,并在控制台输出该对象的私有成员变量值。最后我们在主函数中创建了一个`MyClass`类型的对象并调用了它的`print()`函数。
友元类的使用
友元类是一种特殊的类类型,它可以访问另一个类的所有成员(包括私有成员)。通常情况下,我们需要定义一个类来实现特定的操作,并将该类声明为另一个类的友元类。下面是一个示例:
class MyClass { private: int x, y; // 私有成员变量 public: void print() { // 其他公有成员函数... cout << "x = " << x << ", y = " << y << endl; } friend class OtherClass; // 将 OtherClass 声明为 MyClass 的友元类 }; class OtherClass { // OtherClass 是 MyClass 的友元类类型 public: // OtherClass 的公有成员函数... void doSomething(MyClass& obj) { // 在 OtherClass 中可以直接访问 MyClass 的私有成员变量和公有成员函数 obj.x = 10; obj.y = 20; obj.print(); // 对 MyClass 的私有成员进行赋值并调用公有成员函数 print() } };
在此示例中,我们在`MyClass`中定义了两个私有成员变量和一个名为`print()`的公有成员函数。我们还定义了一个名为`OtherClass`的友元类类型,并在其中定义了一个名为`doSomething()`的公有成员函数。该函数接受一个指向`MyClass`类型的参数对象的对象引用,并在控制台中对参数对象的私有成员进行赋值并调用公有成员函数`print()`来输出结果。最后我们在主函数中创建了一个`MyClass`类型的对象和一个`OtherClass`类型的对象并调用了它们的相应函数来测试结果。