第8节 类中的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pt_raspi_fresher/article/details/88322199

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

 类通常分为以下两个部分

    类的实现细节
    类的使用方式

  当使用类时,不需要关心其实现细节
  当创建一个类时,才需要考虑其内部实现细节

第二:

 封装的基本概念
  根据日常生活中的经验: 并不是类的每个属性都是对外公开的
     - 如:女孩子不希望外人知道自己的年龄和身高
     - 如:一些男孩子不希望别人知道自己会尿床
  而一些类的属性是对外公开
     - 如:人类的姓名,学历,国籍等
  因此 ,需 要 在类的 表示法中定义属性和行为的公开级别
     -类似文件系统中文件的权限

第三:

C++ 中类的封装
  成 员变量
     C++ 中用于表示类属性的变量
  成 员函数
     C++ 中用于表示类行为的函数
  在 C++ 中可以给成员变量和成员函数定义访问级别
- public
- 成员变量和成员函数可以在类的内部和外界访问和调用
- private
- 成 员变量和成员函数只能在类的内部被访问和调用

第四:

类成员的访问属性

#include <stdio.h>

struct Biology 
{
    bool living;
};

struct Animal : Biology 
{
    bool movable;
    void findFood() 
    { 
    }
};

struct Plant : Biology 
{
    bool growable;
};

struct Beast : Animal 
{
    void sleep()
    { 
    }
};

struct Human : Animal 
{
    void sleep() 
    {
        printf("I'm sleeping...\n");
    }
    
    void work()
    {
        printf("I'm working...\n");
    }
};

struct Girl : Human
{
private:
    int age;

public:
    void play()
    {
        printf("I'm girl, I'm playing...\n");
    }
    
    void print()
    {
        age = 22;
        
        printf("Girl's age is %d\n", age);
         
        play();
        sleep();
        work();
    }
};

struct Boy : Human
{
public:
    int age;
    
    void play()
    {
        printf("I'm boy, I'm playing...\n");
    }
    
    void print()
    {
        age = 23;
        
        printf("Boy's age is %d\n", age);
        
        play();
        sleep();
        work();
    }
};

int main(int argc, char *argv[])
{
    Girl girl;
    
    girl.print();

    Boy boy;
    
    boy.print();
    
    printf("Press any key to continue...");
    getchar();
    return 0;
}

第五:

类成员的作用域

  类成员的作用域都只在类的内部,外部无法直接访问
    成员函数可以直接访问成员变量和调用其它成员函数
  类的外部可以通过类变量访问public 成员
    类成员的作用域与访问级别没有关系


C++ 中用 struct 定义的类的所有成员默认为public

#include <stdio.h>

int i = 1;

struct Test
{
private:
    int i;

public:
    int j;
        
    int getI()
    {
        i = 3;
        
        return i;
    }
};

int main()
{
    int i = 2;
    
    Test test;
    
    test.j = 4;
    
    printf("i = %d\n", i);
    printf("::i = %d\n", ::i);
    //printf("test.i = %d\n", test.i);
    printf("test.j = %d\n", test.j);
    printf("test.getI() = %d\n", test.getI());
    
    printf("Press any key to continue...");
    getchar();
    
    return 0;
}

第六:

类的真正形态

struct 在C 语言中已经有了自己的含义,只能继续兼容
  在 C++ 中提供了新的关键字class 用于类定义
classstruct的用法是完全相同的

  在用struct 定义类时,所有成员的默认属性为public
  在用class 定义类时,所有成员的默认属性为private

#include <stdio.h>

struct A
{
    int i;
    
    int getI()
    {
        return i;
    }
};

class B
{
    int i;       //[Error] 'int B::i' is private
    
    int getI()
    {
        return i;
    }
};

int main(int argc, char *argv[])
{
    A a;
    B b;
    
    a.i = 1;
    a.getI();
    
    b.i = 2;
    b.getI();
    
    printf("Press any key to continue...");
    getchar();
    return 0;
}

第七:

运算类的改进

要求:
1. 提供 setOperator 函数设置运算类型,如加,减,乘,除
2. 提供 setParameter 函数设置运算参数,类型为整型
3. 提供 result 函数进行运算,其返回值表示运算的合法性,通过引用参数返回结果

 在 在Operator 中所有成员函数的实现都在类中完成
 问题:对于使main 函数来说,只需要知道怎么使用
        Operator 即可,没有必要知道其实现
 解决方案:将Operator 类的实现和定义分开
        Operator.h 头文件中只有类的声明
        Operator.cpp 中完成类的其它实现

// Operator.h 
#ifndef _OPERATOR_H_
#define _OPERATOR_H_

class Operator
{
private:
    char mOp;
    double mP1;
    double mP2;
    
public:
    bool setOperator(char op);
    void setParameter(double p1, double p2);
    bool result(double& r);
};

#endif
// Operator.cpp
#include "Operator.h"

bool Operator::setOperator(char op)
{
    bool ret = false;
        
    if( (op == '+') || (op == '-') || (op == '*') || (op == '/') )
    {
        ret = true;
        mOp = op;
    }
    else
    {
        mOp = '\0';
    }
        
    return ret;
}

void Operator::setParameter(double p1, double p2)
{
    mP1 = p1;
    mP2 = p2;
}
    
bool Operator::result(double& r)
{
    bool ret = true;
        
    switch( mOp )
    {
        case '/':
            if( (-0.000000001 < mP2) && (mP2 < 0.000000001) )
            {
                ret = false;
            }
            else
            {
                r = mP1 / mP2;
            }
            break;
        case '+':
            r = mP1 + mP2;
            break;
        case '*':
            r = mP1 * mP2;
            break;
        case '-':
            r = mP1 - mP2;
            break;
        default:
            ret = false;
            break;
    }
        
    return ret;
}
//main.c
#include <stdio.h>
#include "Operator.h"

int main(int argc, char *argv[])
{
    Operator op;
    double r = 0;
    
    op.setOperator('/');
    op.setParameter(8, 4);
    
    if( op.result(r) )
    {
        printf("Result is %f\n", r);
    }
    
    printf("Press any key to continue...");
    getchar();
    return 0;
}

小结

 类的精华在于封装
    将实现细节和使用方式相分离
 C++ 中通过 public 和 private 实现类的封装
    public 成员可以通过变量被外界访问
    private 成员只能够在类内部使用

 类的定义和实现可以分开到不同的文件中

猜你喜欢

转载自blog.csdn.net/pt_raspi_fresher/article/details/88322199