相比于C语言,C++中提供了一种非常实用并且也非常常用的方法——封装,封装是指将某些具有相同属性或性质的变量等归纳在同一处,以达到使用和构造方便。C语言中也提供了一个类似于封装的关键词——struct,但该关键词只限于将变量封装,例如下面的例子:写一个程序计算出两个复数相乘。若果没有封装性:
#include
using namespace std;
int main(){
int re1 = 3;
int im1 = 4;
int re2 = 2;
int im2 = 3;
int ReSum, ImSum; //到此处为止,一共定义了6个变量用于存储三个复数
ReSum = re1 * re2 - im1 * im2; //相乘后的新实部
ImSum = re1 * im2 + re2 * im1; //相乘后的新虚部
cout << "the first complex number is: " << re1 << " + " << im1 << "i" << endl; //输出第一个复数
cout << "the second complex number is: " << re2 << " + " << im2 << "i" << endl; //输出第二个复数
cout << "the result of two complex numbers is: " << ReSum << " + " << ImSum << "i" << endl; //输出相乘后的复数
return 0;
}
输出结果:
以上程序共定义了6个变量,所占系统内存较高,如果采用C语言中的结构体,则相应得会简单许多:
#include
using namespace std;
struct Complex{
int re;
int im;
}; //声明一个结构体struct,用于储存一个虚数的实部和虚部。注意此处的分号不能忘写,否则产生编译错误
int main(){
Complex com1, com2, com3; //定义三个结构体,用于存储三个复数
com1 = {3, 4}; //给第一个复数赋值
com2 = {2, 3}; //给第二个复数赋值
com3.re = com1.re * com2.re - com1.im * com2.im; //相乘后的实部
com3.im = com1.re * com2.im + com2.re * com1.im; //相乘后的虚部
cout << "the first complex number is: " << com1.re << " + " << com1.im << "i" << endl; //输出第一个复数
cout << "the second complex number is: " << com2.re << " + " << com2.im << "i" << endl; //输出第二个复数
cout << "the result of two complex numbers is: " << com3.re << " + " << com3.im << "i" << endl; //输出相乘后的复数
return 0;
}
输出结果与上面相同,但使用了这种结构体之后,大大减少了内存系统中的变量,减少了数据的取和存的次数,加快了程序的运行速度。使用了封装后,其内存管理情况如下:
C++中还提供了一种机制,就是将所需使用的方法与所有的变量一同放在同一结构中,这就是C++中的封装性。举个简单的例子,编写一个程序将大象和猴子塞入冰箱中,对于常规方法来说需要以下几步:
1. 定义大象
2. 打开冰箱门
3. 把大象放入冰箱
4. 关上冰箱门
5. 定义猴子
6. 再次打开冰箱门
7. 把猴子放入冰箱
8. 再次关上冰箱门
但如果使用了结构体,则对上面的复杂的步骤就会减少很多:
1. 定义一个结构体
2. 往结构体中存入大象和猴子
3. 打开冰箱门
4. 将结构体放入冰箱
5. 关上冰箱门
以上方法减少了3个步骤,减少了运行程序时所需内存和时间,但如果将打开冰箱门和关闭冰箱门也存入结构体中,那么以上步骤:
1. 定义结构体
2. 往结构体中存入大象和猴子以及开冰箱门和关冰箱门
3. 调用结构体中的开冰箱门
4. 调用结构体中的关冰箱门
只需4步变完成了这一过程,同样地,对于上面计算复数的程序也可用封装来完成:
#include
using namespace std;
struct Complex{
int re;
int im;
void multiplication(Complex com){ //第二个复数作为参数,传入计算
int rel, ima; //用于存放暂时的实部和虚部
rel = re * com.re - im * com.im;
ima = re * com.im + im * cpm.re; //分别计算新的实部和虚部
re = rel; //将值重新给re
re = ima; //将值重新给im
}
};
int main(){
Complex com1, com2; //定义两个即可完成要求
com1 = {3, 4};
com2 = {2, 3}; //分别给两个复数的实部和虚部赋值
cout << "the first complex number is: " << com1.re << " + " << com1.im << "i" << endl; //输出第一个复数
cout << "the second complex number is: " << com2.re << " + " << com2.im << "i" << endl; //输出第二个复数
com1.multiplication(com2); //此处调用复数1中的乘法,同时将复数2作为参数进行传递并将新结果写入复数1中
cout << "the result of two complex number: " << com1.re << " + " << com.im << "i" << endl; //输出第三个复数
return 0;
}
输出结果和上面一样。
最后一个程序就是C++中的封装过程,将相应的需要的计算方法和对应的变量值一同写入同一个结构体中,该结构体在C++中称为一个对象,而结构体中的变量称之为基本元素(java中也称其为属性attribute),对应的计算方法,C++中称之为基本功能(java中也称之为方法method)。
如有错误,欢迎大家批评与指正!