C++ 数据封装学习笔记

数据封装是面向对象编程中非常重要的概念之一,它可以帮助我们将数据成员和相关的操作封装在一起,形成一个完整的类。在 C++ 中,我们可以使用访问限定符来实现数据封装,其中包括 public、private 和 protected。

访问限定符

public

public 访问限定符表示公共访问级别,即所有的成员函数和变量都可以被类的外部访问。下面是一个简单的例子:

cppCopy Code
class Person { public: string name; int age; void getInfo() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; } }; int main() { Person p; p.name = "Tom"; p.age = 20; p.getInfo(); return 0; }

在这个示例中,我们定义了一个名为 Person 的类,并将变量 name 和 age 设置为 public 属性,这意味着我们可以在类的外部直接访问和修改这些变量。同时还定义了一个 getinfo 函数,该函数也可以在类的外部被访问。

private

private 访问限定符表示私有访问级别,即只有类内部的成员函数才能够访问和修改成员变量。下面是一个示例:

cppCopy Code
class Person { private: string name; int age; void getInfo() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; } }; int main() { Person p; p.name = "Tom"; // 编译错误,name 是私有变量,无法在类外部访问 p.age = 20; // 编译错误,同上 p.getInfo(); // 编译错误,getInfo 函数是私有函数,无法在类外部访问 return 0; }

在这个示例中,我们将变量 name 和 age 设置为私有属性,并定义了一个 getinfo 函数,但这些成员变量和函数都只能在类的内部使用。

protected

protected 访问限定符表示保护访问级别,即只有类内部的成员函数和派生类中的成员函数才能访问和修改成员变量。下面是一个示例:

cppCopy Code
class Person { protected: string name; int age; void getInfo() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; } }; class Student : public Person { public: void setName(string newName) { name = newName; // 可以直接访问 Person 类中的 name 变量 } void setAge(int newAge) { age = newAge; // 可以直接访问 Person 类中的 age 变量 } void showInfo() { getInfo(); // 可以直接访问 Person 类中的函数 } }; int main() { Student s; s.setName("Tom"); s.setAge(20); s.showInfo(); return 0; }

在这个示例中,我们定义了一个 Student 类继承自 Person 类,并且将其访问限定符设置为 protected。由于 Student 类是 Person 类的派生类,因此它可以直接访问和修改 Person 类中的成员变量和函数。

实例

下面是一个使用数据封装来保护成员变量和实现成员函数的示例:

cppCopy Code
class Circle { private: double radius; public: void setRadius(double r) { if (r < 0) { cout << "Error: Radius cannot be negative." << endl; return; } radius = r; } double getRadius() { return radius; } double area() { return 3.14 * radius * radius; } }; int main() { Circle c; c.setRadius(-1); // 输出错误提示信息 c.setRadius(2); cout << "Radius: " << c.getRadius() << endl; // 输出半径值 cout << "Area: " << c.area() << endl; // 输出面积值 return 0; }

在这个示例中,我们定义了一个 Circle 类,将成员变量 radius 设置为私有属性,然后创建了 setRadius、getRadius 和 area 函数来实现对半径的设置、获取和面积的计算。其中,在 setRadius 函数内部对半径是否为负数进行了判断,并输出错误提示信息。

以上就是关于 C++ 数据封装的学习笔记和示例代码。