• 第16课类的真正形态


    类的真正形态(上)

    问题:经过不停的改进,结构体struct变得越来越不像它在C语言中的样子了。
    在C语言中,struct中是不能定义成员函数的,你如果实在想用成员函数,只能定义成函数指针的形式。这种方式在内核中太普遍了。

    struct 在C语言中已经有了自己的含义,因此C++也得必须继续兼容,但是在兼容的基础上又有了改进,比如说可以定义成员函数了。
    在C++中提供了新的关键字class用于类定义
    class和struct的用法是完全相同的

    class和struct有什么本质区别?
    在用struct定义类时,所有成员的默认访问级别为public
    在用class定义类时,所有成员的默认访问级别为private

    struct A
    {
      //default to public
      int i;
      //default to public
      int getI()
      {
        return i;
      }
    };

    class A
    {
      //default to private
      int i;
      //default to private
      int getI()
      {
        return i;
      }
    };
    好的习惯:不管是用class定义类,还是用struct定义类,必须显示的指明成员变量和成员函数的访问级别。

    类的真正形态(下)

    小实例
    需求:开发一个用于四则运算的类
    -提供setOperator函数设置运算类型
    -提供setParameter函数设置运算参数
    -提供result函数进行运算
      其返回值表示运算的合法性
      通过引用参数返回结果

    C++中的类支持声明实现的分离
    声明就是类的使用方式,实现就是类的实现细节

    将类的实现和定义分开
    -.h 头文件中只有类的声明
      .成员变量和成员函数的声明
    -.cpp源文件中完成类的其它实现
      .成员函数的具体实现

    实例分析
    Operator类的分析
    Operator.h

     1 #ifndef _OPERATOR_H_
     2 #define _OPERATOR_H_
     3 
     4 class Operator
     5 {
     6 private:
     7     char mOp;
     8     double mP1;
     9     double mP2;
    10     
    11 public:
    12     bool setOperator(char op);
    13     void setParameter(double p1, double p2);
    14     bool result(double& r);
    15 };
    16 
    17 #endif

    Operator.cpp

     1 #include "Operator.h"
     2 
     3 bool Operator::setOperator(char op)
     4 {
     5     bool ret = false;
     6         
     7     if( (op == '+') || (op == '-') || (op == '*') || (op == '/') )
     8     {
     9         ret = true;
    10         mOp = op;
    11     }
    12     else
    13     {
    14         mOp = '';
    15     }
    16         
    17     return ret;
    18 }
    19 
    20 void Operator::setParameter(double p1, double p2)
    21 {
    22     mP1 = p1;
    23     mP2 = p2;
    24 }
    25     
    26 bool Operator::result(double& r)
    27 {
    28     bool ret = true;
    29         
    30     switch( mOp )
    31     {
    32         case '/':
    33             if( (-0.000000001 < mP2) && (mP2 < 0.000000001) )
    34             {
    35                 ret = false;
    36             }
    37             else
    38             {
    39                 r = mP1 / mP2;
    40             }
    41             break;
    42         case '+':
    43             r = mP1 + mP2;
    44             break;
    45         case '*':
    46             r = mP1 * mP2;
    47             break;
    48         case '-':
    49             r = mP1 - mP2;
    50             break;
    51         default:
    52             ret = false;
    53             break;
    54     }
    55         
    56     return ret;
    57 }

    类已经定义好了,接下来进行类的使用

     1 #include <stdio.h>
     2 #include "Operator.h"
     3 
     4 int main()
     5 {
     6     Operator op;
     7     double r = 0;
     8     op.setOperator('/');
     9     op.setParameter(9,3);
    10     
    11     if (op.result(r))
    12     {
    13         printf("r = %lf
    ",r);
    14     }
    15     else
    16     {
    17         printf("Calculate error!
    ");
    18     }
    19     
    20     return 0;
    21 }

    小结:

    C++引进了新的关键字class用于定义类
    struct 和class的区别在于默认访问级别的不同
    C++中的类支持声明和实现的分离
      在头文件中声明类
      在源文件中实现类

     

     

  • 相关阅读:
    laravel读excel
    React 还是 Vue: 你应该选择哪一个Web前端框架?
    React16版本的新特性
    你真的了解React吗
    express操作数据库
    跨域的九种解决方式
    Koa基本使用
    luogu3806 【模板】点分治1
    luogu2634 聪聪可可
    poj1741 Tree
  • 原文地址:https://www.cnblogs.com/-glb/p/11756044.html
Copyright © 2020-2023  润新知