C++的封装性

相比于C语言,C++中提供了一种非常实用并且也非常常用的方法——封装,封装是指将某些具有相同属性或性质的变量等归纳在同一处,已达到使用和构造方便。C语言中也提供了一个类似于封装的关键词——struct,但该关键词只限于将变量封装,例如下面的例子:写一个程序计算出两个复数相乘。若果没有封装性:

#include <iostream>
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 <iostream>
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 <iostream>
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)。

如有错误,欢迎大家批评与指正!

猜你喜欢

转载自blog.csdn.net/WJ_SHI/article/details/81702454