【C++基础入门】13.C++中类的真正形态

169 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

文章目录

一、类的关键字

二、类的真正形态

三、小实例

四、小结


一、类的关键字

  • struct 在 C 语言中已经有了自己的含义,必须继续兼容
  • 在C++ 中提供了新的关键字 class 用于类定义
  • class 和 struct 的用法是完全相同的
  • 在用 struct 定义类时,所有成员的默认访问级别为 public
  • 在用 class 定义类时,所有成员的默认访问级别为 private

        如下:

​编辑

          下面看一段使用 class 的代码:

#include <stdio.h>

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

class B
{
    // defualt to private
    int i;
    // defualt to private
    int getI()
    {
        return i;
    }
};

int main()
{
    A a;
    B b;
    
    a.i = 4;
    
    printf("a.getI() = %d\n", a.getI());
    
    b.i = 4;
    
    printf("b.getI() = %d\n", b.getI());
    
    return 0;
}

         下面为输出结果,运行报错,指出 class 声明的类,所有成员的默认访问级别为 private

​编辑

         在 class B 里面加个 public 即可,如下:

class B
{
public:
    // defualt to private
    int i;
    // defualt to private
    int getI()
    {
        return i;
    }
};

        下面为输出结果:

​编辑

二、类的真正形态

  • C++ 中的类支持声明和实现的分离

  • 将类的实现和定义分开

    • .h头文件中只有类的声明

      • 成员变量和成员函数的声明
    • .cpp源文件中完成类的其它实现

      • 成员函数的具体实现

三、小实例

  • 需求:开发一个用于四则运算的类

    • 提供 setOperator 函数设置运算类型

    • 提供 setParameter 函数设置运算参数

    • 提供 result 函数进行运算

      • 其返回值表示运算的合法性
      • 通过引用参数返回结果

        代码如下:

        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;

}

        test.cpp 

#include <stdio.h>
#include "Operator.h"

int main()
{
    Operator op;
    double r = 0;
    
    op.setOperator('/');
    op.setParameter(9, 3);
    
    if( op.result(r) )
    {
        printf("r = %lf\n", r);
    }
    else
    {
        printf("Calculate error!\n");
    }
    
    return 0;
}

        下面为输出结果:

​编辑

四、小结

  • C++ 引进了新的关键字 class 用于定义类

  • struct 和 class 的区别在于默认访问级别的不同

  • C++ 中的类支持声明和实现的分离

    • 在头文件中声明类
    • 在源文件中实现类