封装
封装这个词的部分含义是 “围绕” 一个实体的想法,不仅仅是把内在的东西放在一起,而且还要保护它。
在面向对象方面,封装不仅仅是将一个类中的属性和行为组合在一起,这也意味着限制进入该类的内部工作。
这里的关键原则是一个对象只显示其他应用程序组件需要有效运行应用程序的内容。其他一切都被保留在视野之外(隐藏)。
这被称为数据隐藏。
例如,如果我们使用 BankAccount 类,我们不希望程序的其他部分进入并更改任何对象的 balance ,而无需通过 deposit() 或 withdraw() 行为。
我们应该隐藏这个属性,控制对它的访问,所以它只能被对象本身访问。这样,balance 不能直接从物体外面改变,只能用其方法进行访问。
这也被称为“黑匣子”,是指关闭对象的内部工作区域,除了我们想要公开的部分。
这使我们可以在不改变整个程序的情况下改变方法的属性和实现。例如,我们可以稍后再回来,更改 balance 属性的数据类型。
总之封装的好处是:
- 控制数据访问或修改的方式。
- 代码更加灵活,易于根据新的要求进行更改。
- 更改代码的一部分而不影响其他代码部分。
封装示例
访问说明符
访问说明符用于为特定成员设置访问级别。
访问说明符的三个级别是 public, protected, 和 private.
一个 public 成员可以从类以外的任何地方访问,也可以在类对象的范围内的任何地方访问。
例如:
#include <iostream>
#include <string>
using namespace std;
class myClass {
public:
string name;
};
int main() {
myClass myObj;
myObj.name = "Eeedong Loen";
cout << myObj.name;
return 0;
}
//输出 "Eeedong Loen"
name 属性是 public (公共的);它可以从代码之外访问和修改。
访问修饰符只需要声明一次; 多个成员可以遵循单个访问修饰符。注意 public 关键字后面的冒号(:)
【填空题】填空, 输入一个代码来声明一个类 MyClass,其中一个名为 myData 的数据成员为string类型,然后为它赋值“我爱C++”。
#include <iostream>
#include <string>
class MyClass
{
public:
string myData;
}
int main()
{
MyClass obj;
obj.myData = "我爱C++";
}
Private
一个 private 成员不能从类外访问(对外不可见);只能从类内部进行访问。
#include <iostream>
#include <string>
using namespace std;
class myClass {
public:
void setName(string x) {
name = x;
}
private:
string name;
};
int main() {
myClass myObj;
myObj.setName("Loen");
return 0;
}
name 属性是 private 私有的,不能从外部访问。
setName() 方法是 public 并在方法中使用到了 name 属性
如果未定义访问说明符,则默认情况下,类的所有成员都设置为 private。
【填空题】填空, 声明一个类 MyClass,其中一个名为 myData 的私有数据成员的类型为 int。声明一个公共函数setMyData(),将myData值设置为由其参数指定的值。
#include <iostream>
class MyClass
{
private:
int myData;
public:
void setmyData(int arg){
myData = arg
}
};
访问说明符
我们可以添加另一个公共方法来获取属性的值。
class myClass {
public:
void setName(string x) {
name = x;
}
string getName() {
return name;
}
private:
string name;
};
getName() 方法返回 私有属性 name 的值。
【填空题】填空, 声明 getMyData 函数, 其返回 myData
class MyClass
{
private:
int myData;
public:
int getMtdata(){
return myData;
}
}
把访问说明符放在一起:
#include <iostream>
#include <string>
using namespace std;
class myClass {
public:
void setName(string x) {
name = x;
}
string getName() {
return name;
}
private:
string name;
};
int main() {
myClass myObj;
myObj.setName("Loen");
cout << myObj.getName();
return 0;
}
//输出 "Loen"
我们使用封装来隐藏来自外部代码的名称属性。然后我们使用公共方法提供访问权限。我们的类数据只能通过这些方法读取和修改。
这样允许更改方法和属性的实现,而不会影响外部代码。
【填空题】填空, 输入缺少的部分来声明 MyClass 对象,并将其数据成员的值设置为28,然后将其值显示在屏幕上。通过公共函数 setMyData 和 getMyData 执行所有提到的操作。
int main()
{
MyClass obj;
obj.setMyData(28);
cout << obj.getMyData() << endl;
}
文章评论
Howdy! I just wish to offer you a big thumbs up for your excellent info you have got here on this post. Ill be returning to your site for more soon.