C++的访问控制(封装)
访问说明符
在之前的我们介绍了如何定义一个简单的类,那时候使用的是struct关键字。在C++中,还可以使用访问说明符来控制成员的可访问性。如果想要控制成员的可访问性,需要在定义类时使用class关键字。访问说明符有以下几种:
-
public:公有成员可以被任何人访问,无论是类的对象还是类的成员函数。 -
private:私有成员只能被类的成员函数和其友元函数访问。这是class类成员的默认访问级别。 -
protected:受保护成员可以被类的成员函数、派生类的成员函数以及友元函数访问,但不能被类对象直接访问。
使用
class和struct定义类的唯一区别是默认的访问权限。
class默认的访问权限为private,而struct默认的访问权限为public。
下面是一个简单的例子,展示了如何在类中使用这些访问控制符:
class MyClass {
public:
int publicVar; // 公有成员变量
MyClass() : publicVar(0), privateVar(0), protectedVar(0) {}
void publicFunction() {
// 可以访问public, private, 和 protected成员
}
private:
int privateVar; // 私有成员变量
void privateFunction() {
// 可以访问public, private, 和 protected成员
}
protected:
int protectedVar; // 受保护成员变量
void protectedFunction() {
// 可以访问public, private, 和 protected成员
}
};
class Derived : public MyClass {
// Derived类可以访问MyClass的public和protected成员,但不能直接访问private成员
};
int main() {
MyClass obj;
obj.publicVar = 1; // 正确:public成员可以在类外部访问
// obj.privateVar = 2; // 错误:private成员不能在类外部访问
// obj.protectedVar = 3; // 错误:protected成员不能在类外部通过类的对象访问
return 0;
}
在这个例子中,publicFunction、privateFunction和protectedFunction都可以在类内部访问所有类型的成员变量,但是从类外部只能访问public成员。派生类可以访问public和protected成员,但不能访问private成员。
友元
当我们把类的成员声明为private,在类外就不能调用类的成员了,那么有没有一种方法能够调用class声明的类?其中一种方法就是将我们想要类访问的接口声明为public,而另一种方法就是将其他类或者想要调用的函数声明为友元。
下面是一个使用友元函数的例子:
#include <iostream>
class Box {
// 声明一个友元函数
friend void printWidth(Box box);
private:
double width;
public:
Box() : width(0) {}
void setWidth(double wid) {
width = wid;
}
};
// 定义一个友元函数
void printWidth(Box box) {
// printWidth()是Box的友元,它可以直接访问Box的任何成员
std::cout << "Width of box: " << box.width << std::endl;
}
int main() {
Box box;
// 使用成员函数设置宽度
box.setWidth(10.0);
// 使用友元函数输出宽度
printWidth(box);
return 0;
}
一般来说,在类定义开始或结束前的位置集中声明友元。
在类中的友元定义仅仅制定了访问权限,并非函数声明。这意味着我们必须在类外重新声明并定义这个类。尽管有些编译器可以仅声明友元,但最好还是提供一个独立的函数声明。
评论区