C++ 类之访问控制
在C++中,访问控制(Access Control)是指控制类成员(变量和函数)的访问权限。访问控制通过访问说明符(Access Specifiers)来实现,主要有以下三种:
public
:公有访问权限
protected
:受保护访问权限
private
:私有访问权限
此外,C++还提供了友元函数和友元类机制,以允许特定的非成员函数或类访问类的私有和受保护成员。
1. public
访问权限
- 描述:公有成员可以在类的外部被访问。
- 应用场景:用于需要在类的外部访问的成员,如接口函数。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class MyClass { public: int publicVar;
void publicMethod() { } };
int main() { MyClass obj; obj.publicVar = 10; obj.publicMethod(); return 0; }
|
2. protected
访问权限
- 描述:受保护成员可以在类的内部和派生类中被访问,但不能在类的外部被访问。
- 应用场景:用于需要在派生类中访问但不希望在类的外部访问的成员。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Base { protected: int protectedVar;
void protectedMethod() { } };
class Derived : public Base { public: void accessProtected() { protectedVar = 10; protectedMethod(); } };
int main() { Derived obj; obj.accessProtected(); return 0; }
|
3. private
访问权限
- 描述:私有成员仅可以在类的内部被访问,不能在类的外部或派生类中被访问。
- 应用场景:用于仅在类的内部访问的成员,通常用于实现细节。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class MyClass { private: int privateVar;
void privateMethod() { }
public: void accessPrivate() { privateVar = 10; privateMethod(); } };
int main() { MyClass obj; obj.accessPrivate(); return 0; }
|
4. 友元函数和友元类
- 友元函数:非成员函数,但被授予访问类的私有和受保护成员的权限。常用于操作符重载和辅助函数。
- 友元类:一个类,被授予访问另一个类的私有和受保护成员的权限。常用于紧密耦合的类之间的合作。
友元函数示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class MyClass { private: int privateVar;
public: MyClass(int x) : privateVar(x) {}
friend void printPrivateVar(const MyClass& obj); };
void printPrivateVar(const MyClass& obj) { std::cout << "Private variable: " << obj.privateVar << std::endl; }
int main() { MyClass obj(10); printPrivateVar(obj); return 0; }
|
友元类示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class MyClass { private: int privateVar;
public: MyClass(int x) : privateVar(x) {}
friend class FriendClass; };
class FriendClass { public: void printPrivateVar(const MyClass& obj) { std::cout << "Private variable: " << obj.privateVar << std::endl; } };
int main() { MyClass obj(10); FriendClass friendObj; friendObj.printPrivateVar(obj); return 0; }
|
5. 访问控制的继承关系
在继承关系中,基类的访问控制会影响派生类对基类成员的访问权限。继承方式有三种:public
继承、protected
继承和 private
继承。
public
继承
- 基类的
public
成员在派生类中仍然是 public
。
- 基类的
protected
成员在派生类中仍然是 protected
。
protected
继承
- 基类的
public
成员在派生类中变为 protected
。
- 基类的
protected
成员在派生类中仍然是 protected
。
private
继承
- 基类的
public
和 protected
成员在派生类中都变为 private
。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Base { public: int publicVar; protected: int protectedVar; private: int privateVar; };
class PublicDerived : public Base { };
class ProtectedDerived : protected Base { };
class PrivateDerived : private Base { };
|
总结
- **
public
**:公有访问权限,允许类的成员在类的外部被访问。
- **
protected
**:受保护访问权限,允许类的成员在类的内部和派生类中被访问。
- **
private
**:私有访问权限,允许类的成员仅在类的内部被访问。
- 友元函数和友元类:允许特定的非成员函数或类访问类的私有和受保护成员。
- 继承关系中的访问控制:基类的访问控制会影响派生类对基类成员的访问权限,具体取决于继承方式(
public
、protected
、private
)。