在C++编程语言中,面向对象编程的一个关键概念是封装,它强调保护数据的安全性和隐藏实现细节。在C++中,我们可以通过访问控制修饰符(如public、private和protected)来实现封装。本文将深入讨论私有数据成员和友元在C++中的使用,这是2022年计算机二级考试C++复习的重要知识点。
一、私有数据成员
私有数据成员(private members)是类中只能在类内部访问的数据成员。外部代码不能直接访问这些成员,以防止未经授权的修改或访问。通常,我们会提供公有成员函数(public member functions),即接口,来访问和修改私有数据成员。例如:
```cpp
class Date {
int mo, da, yr;
public:
Date(int m, int d, int y) { mo = m; da = d; yr = y; }
int getyear() const { return yr; }
void setyear(int y) { yr = y; }
};
```
在这个例子中,`getyear()` 是一个取值函数,返回私有成员 `yr` 的值,而 `setyear()` 是一个赋值函数,允许设置 `yr` 的值。这些函数构成了公共接口,外部代码可以通过它们来操作私有数据。
二、友元(Friend)
友元(Friend)是C++中的一个特性,允许类的私有或受保护成员对其他类或函数开放。友元可以是类的成员函数或者非成员函数。友元函数可以访问声明它的类的私有和受保护成员,即使它不是该类的成员。
1. 友元类:一个类可以声明另一个类为友元,这样友元类的成员函数就可以访问原类的私有和受保护成员。
```cpp
class Time; // 前向声明
class Date {
int mo, da, yr;
friend class Time; // 声明 Time 为友元类
public:
// ...
};
class Time {
int hr, min, sec;
public:
// ...
};
```
2. 友元函数:非类成员的友元函数可以直接访问声明它的类的私有和受保护成员。
```cpp
void display(const Date &dt, const Time &tm);
```
如果 `display()` 函数需要访问 `Date` 和 `Time` 类的私有数据,可以将它声明为这两个类的友元。
```cpp
class Date {
// ...
friend void display(const Date&, const Time&);
};
class Time {
// ...
friend void display(const Date&, const Time&);
};
```
现在 `display()` 函数可以自由地访问 `Date` 和 `Time` 类的私有数据成员,如示例所示:
```cpp
void display(const Date &dt, const Time &tm) {
cout << dt.mo << "/" << dt.da << "/" << dt.yr << " ";
cout << tm.hr << ":" << tm.min << ":" << tm.sec;
}
```
三、匿名对象
匿名对象是在创建时不给它赋予名字的对象。在上述示例中,`CustomDate(123, 89)` 创建了一个匿名 `CustomDate` 对象,然后立即用于初始化 `Date` 对象 `dt`。这种用法在某些场景下是方便的,但需要注意的是,匿名对象的生命周期很短,一旦创建完毕,其作用域仅限于创建它的语句。
总结来说,私有数据成员和友元是C++实现封装和数据安全性的重要机制。私有数据成员确保了数据的内部状态不被外部随意篡改,而友元机制则允许在必要时打破封装,以便类之间可以协同工作。理解并熟练运用这些概念对于通过计算机二级C++考试以及实际编程至关重要。