C++深入探索类真正的形态之struct与class

目录
  • 一、类的关键字
  • 二、类的真正形态
  • 三、小实例
  • 四、小结

一、类的关键字

  • 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++ 中的类支持声明和实现的分离

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

到此这篇关于C++深入探索类真正的形态是的文章就介绍到这了,更多相关C++类的形态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中声明类的class与声明结构体的struct关键字详解

    class class 关键字声明类类型或定义类类型的对象. 语法 [template-spec] class [ms-decl-spec] [tag [: base-list ]] { member-list } [declarators]; [ class ] tag declarators; 参数 template-spec 可选模板说明. ms-decl-spec 可选存储类说明有关更多信息 tag 给定于类的类型名称.在类范围内的标记成为了保留字.标志是可选项.如果省略,定义匿名类.

  • C++中关键字Struct和Class的区别

    Struct和Class的区别 今天这篇博文主要讲解在C++中关键字struct和class的区别.这篇博文,将会系统的将这两个关键字的不同面进行详细的讲解. 从语法上来讲,class和struct做类型定义时只有两点区别: 1.默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理: 2.成员的默认访问权限.class的成员默认是private权限,struct默认是public权限.以上两点也是struct和class最基本的

  • C++结构体struct和类class区别详解

    之前因为都在忙着毕业的开题答辩与投稿论文的事宜,一直没有时间更新这个系列的文章.师弟看了上一篇雾中风景的文章,希望我继续把这个系列的文章写下去.坦白说,C++的特性很多,这也不是教学指南的文章,我会选取一些自己在学习C++过程之中值得探讨的问题和大家聊一聊,来抛砖引玉.好的,今天先放点开胃菜,和大家聊聊struct与class关键字. 1.struct关键字: 在C++语言作为C语言的一个超集,是兼容C语言的所有语法规则的.C语言是我学习的第一门编程语言,我自然对于其中的语法规则十分熟悉,C语言

  • C++ class和struct到底有什么区别详解

    C++ 中保留了C语言的 struct 关键字,并且加以扩充.在C语言中,struct 只能包含成员变量,不能包含成员函数.而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数. C++中的 struct 和 class 基本是通用的,唯有几个细节不同: 使用 class 时,类中的成员默认都是 private 属性的:而使用 struct 时,结构体中的成员默认都是 public 属性的. class 继承默认是 private 继承,而 struct 继承默

  • C++基础 class、struct、union详细

    目录 1.类class 2.结构体struct 3.共用体union 1.类class 类是面向对象中的特性,在c中是没有类的概念.通常用class来表示,cpp中有抽象类,但是没有接口这种说法,cpp支持多继承. 一个普通的类: class Fruit { private: public: Fruit(); ~Fruit(); }; Fruit::Fruit() { } Fruit::~Fruit() { } 构造函数和析构函数: 其中Fruit()表示构造函数, ~Fruit()表示析构函数

  • 深入C++中struct与class的区别分析

    一.C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗?   能!struct能继承吗?  能!!struct能实现多态吗?   能!!! 最本质的一个区别就是默认的访问控制,体现在两个方面:1)默认的继承访问权限.struct是public的,class是private的.   写如下的代码: 复制代码 代码如下: struct A{  char a;}:struct B : A{  cha

  • C++深入探索类真正的形态之struct与class

    目录 一.类的关键字 二.类的真正形态 三.小实例 四.小结 一.类的关键字 struct 在 C 语言中已经有了自己的含义,必须继续兼容 在C++ 中提供了新的关键字 class 用于类定义 class 和 struct 的用法是完全相同的 在用 struct 定义类时,所有成员的默认访问级别为 public 在用 class 定义类时,所有成员的默认访问级别为 private 如下: 下面看一段使用 class 的代码: #include <stdio.h> struct A { // d

  • C++深入探索类和对象之封装及class与struct的区别

    目录 封装的意义 访问权限 class和struct的区别 成员属性私有 案例练习 封装的意义 封装是C++三大面向对象之一 意义: 1.设计类的时候,属性和行为写在一起,表现事物 2.类在设计时,可以把属性和行为放在不同的权限下,加以控制 语法:class 类名 {访问权限:属性 / 行为}: 示例1:设计一个直角三角形,并求解他的面积 #include<iostream> using namespace std; //class代表设计一个类,后面跟着的是类名 class taiAngle

  • Swift中的类class与结构体struct体学习笔记

    一.引言 Swift中的类与结构体十分相似,和Objective-C不同的事,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法. Swift中的类与结构体有如下相似点: 1.定义属性来存储值. 2.定义函数来提供功能. 3.通过定义下标语法使用下标的方式取值. 4.定义构造方法来对其进行初始化. 5.通过扩展来在原始基础上添加功能. 6.通过协议来定义实现标准. 当然类和结构体也有许多不同点,下面这些功能是类独有的,结构体没有: 1.通过继承来创建类的子类. 2.在运行时允许对类

  • Swift类和对象的底层探索分析

    目录 引言 1. 对象 1.1 上层代码中查找 1.1.1 查找对象调用方法 1.1.2 设置符号断点 1.2 swift_allocObject 1.3 swift_showAlloc 1.4 查看HeapObject结构体 1.5 对象内存大小计算 1.6 总结 2. 类 2.1 查找HeapMetadata 2.2. TargetHeapMetaData 2.3. TargetMetaData 2.4. TargetClassMetadata 2.5. TargetAnyClassMeta

  • Linux 下读XML 的类详解及实现代码

     Linux 下读XML 的类详解及实现代码 在Linux下写程序,常需要读一些配置文件.现有的XML工具很多,可以方便的编辑和生成XML. 但VC中用的XML解析器在Linux下不能用.只好自已写了个.用了一下,还不错. #include <stdio.h> #include <stdlib.h> // ********************************************************************** // // XML解析类(hongh

  • C++图解单向链表类模板和iterator迭代器类模版详解

    目录 1.链表介绍 1.1单链表插入某个节点流程 1.2单链表删除某个节点流程 1.3单链表清除所有节点流程 2.实现单链表 2.1indexOf()函数示例如下所示: 3.实现一个迭代器来优化链表遍历 3.1为什么要实现一个迭代器? 总结 链表用来构建许多其它数据结构,如堆栈,队列和他们的派生. 对于非线性的链表,可以参见相关的其他数据结构,例如二叉树.图等. 1.链表介绍 常见的线性链表分为三种 单链表: 每个结点都含有指向其后继结点的地址信息 双向链表: 每个结点都有指向其前驱结点和后继结

  • C++ 双向循环链表类模版实例详解

    目录 1.插入某个节点流程 2.构造函数修改 3.重新实现append和prepend函数 4.修改迭代器类 5.LinkedList.h代码如下 6.测试运行 总结 在上章C++图解单向链表类模板和iterator迭代器类模版详解 我们学习了单链表,所以本章来学习双向循环链表 我们在上个文章代码上进行修改, 由于双向循环链表在我们之前学的单链表上相对于较为复杂,所以需要注意的细节如下所示. 1.插入某个节点流程 如下图所示: 对应代码如下所示: /*插入一个新的节点*/ bool insert

  • 使用Node.js实现ORM的一种思路详解(图文)

    ORM是O和R的映射.O代表面向对象,R代表关系型数据库.二者有相似之处同时也各有特色.就是因为这种即是又非的情况,才需要做映射的. 理想情况是,根据关系型数据库(含业务需求)的特点来设计数据库.同时根据面向对象(含业务需求)的特点来设计模型(实体类).然后再去考虑如何做映射.但是理想很骨jian感dan,现实太丰fu满za. 没见哪个ORM是这么做的,也没见哪位高手会这么做设计.那么实际情况是什么样子的呢?以.net的Entity Framework为例. DB frist,就是先设计好数据库

  • 初步理解Swift中的泛型

    如果你已经动手写过Swift的程序,相信你已经了解了Swift语言的知识,比如如何写类(class)和结构体(struct).但Swift可没这么简单,呵呵呵.这篇教程主要讲述Swift的一个强力的特性:泛型.这个特性在很多程序设计语言里都非常受欢迎. 对于类型安全(type-safe)语言,一个常见的问题就是如何编写适用于多种类型输入的程序.想象一下,两个整型数相加和两个浮点数相加的程序看起来应该非常类似,甚至一模一样才对.唯一的区别就是变量的类型不同. 在强类型语言中,你需要去定义诸如add

  • 详解iOS 用于解决循环引用的block timer

    一.什么是回调函数? 回调函数,本质上也是个函数(搁置函数和方法的争议,就当这二者是一回事).由"声明"."实现"."调用"三部分组成. 在上面的例子中,我可以看出,函数amount(其实是Block),的声明和调用在A类中,而实现部分在B类中.也就是说,B类实现了amount函数,但并没有权限调用,最终还是 由A类触发调用.我们称这样的机制为"回调".意思是"虽然函数的实现写在B类中,但是真正的调用还是得由A类来完

随机推荐