C++ 等面向对象编程语言的主要特性之一是数据隐藏。
数据隐藏是指限制对类的数据成员的访问。这是为了防止其他函数和类篡改类数据。
然而,为了能够间接操作隐藏的数据,使某些成员函数和成员数据可访问也是很重要的。
C++ 的访问修饰符允许我们确定哪些类成员可供其他类和函数访问,哪些则不能。
例如,
class Patient {
private:
int patientNumber;
string diagnosis;
public:
void billing() {
// code
}
void makeAppointment() {
// code
}
};
在这里,Patient
类中的变量 patientNumber 和 diagnosis 使用 private
关键字隐藏起来,而成员函数则使用 public
关键字使其可访问。
C++ 访问修饰符的类型
在 C++ 中,有 3 种访问修饰符
public
private
protected
public 访问修饰符
public
关键字用于创建公共成员(数据和函数)。- 公共成员可以从程序的任何部分访问。
示例 1:C++ public 访问修饰符
#include <iostream>
using namespace std;
// define a class
class Sample {
// public elements
public:
int age;
void displayAge() {
cout << "Age = " << age << endl;
}
};
int main() {
// declare a class object
Sample obj1;
cout << "Enter your age: ";
// store input in age of the obj1 object
cin >> obj1.age;
// call class function
obj1.displayAge();
return 0;
}
输出
Enter your age: 20 Age = 20
在此程序中,我们创建了一个名为 Sample
的类,其中包含一个 public
变量 age 和一个 public
函数 displayAge()
。
在 main()
中,我们创建了 Sample
类的一个名为 obj1 的对象。然后,我们通过 obj1.age
和 obj1.displayAge()
这两行代码直接访问公共元素。
请注意,公共元素可以从 main()
访问。这是因为公共元素可以从程序的任何部分访问。
private 访问修饰符
private
关键字用于创建私有成员(数据和函数)。- 私有成员只能在类内部访问。
- 但是,友元类和友元函数可以访问私有成员。
示例 2:C++ private 访问说明符
#include <iostream>
using namespace std;
// define a class
class Sample {
// private elements
private:
int age;
// public elements
public:
void displayAge(int a) {
age = a;
cout << "Age = " << age << endl;
}
};
int main() {
int ageInput;
// declare an object
Sample obj1;
cout << "Enter your age: ";
cin >> ageInput;
// call function and pass ageInput as argument
obj1.displayAge(ageInput);
return 0;
}
输出
Enter your age: 20 Age = 20
在 main()
中,对象 obj1 无法直接访问类变量 age。
// error
cin >> obj1.age;
我们只能通过公共函数 displayAge()
间接操作 age,因为该函数使用传递给它的参数(即函数参数 int a
)的值来初始化 age。
protected 访问修饰符
在学习 protected
访问说明符之前,请确保您了解 C++ 中的继承。
protected
关键字用于创建受保护成员(数据和函数)。- 受保护成员可以在类内部以及从派生类中访问。
示例 3:C++ protected 访问说明符
#include <iostream>
using namespace std;
// declare parent class
class Sample {
// protected elements
protected:
int age;
};
// declare child class
class SampleChild : public Sample {
public:
void displayAge(int a) {
age = a;
cout << "Age = " << age << endl;
}
};
int main() {
int ageInput;
// declare object of child class
SampleChild child;
cout << "Enter your age: ";
cin >> ageInput;
// call child class function
// pass ageInput as argument
child.displayAge(ageInput);
return 0;
}
输出
Enter your age: 20 Age = 20
在这里,SampleChild
是一个从 Sample
派生的继承类。变量 age 在 Sample
中被声明为 protected
关键字。
这意味着 SampleChild
可以访问 age,因为 Sample
是它的父类。
我们在 SampleChild
中为 age 赋值,尽管 age 在 Sample
类中声明,这一点有所体现。
总结:public、private 和 protected
public
元素可以被所有其他类和函数访问。private
元素不能在声明它们的类之外访问,除了友元类和友元函数。protected
元素与private
元素类似,只是它们可以被派生类访问。
说明符 | 同一类 | 派生类 | 类外 |
---|---|---|---|
public |
是 | 是 | 是 |
private |
是 | 否 | 否 |
protected |
是 | 是 | 否 |
注意: 默认情况下,C++ 中的类成员是 private
的,除非另有说明。