1,经过不停的改进,结构体 struct 变得原来越不像它在 C 语言中的样子了;

1,struct 在 C 语言中仅为了定义一个变量的集合,仅此而已,不能定义函数;

2,struct 在 C++ 中既可以定义访问级别又可以定义成员函数;

2,类的关键字:

1,struct 在 C 语言中已经有了自己的含义,必须继承兼容;

1,而在 C++ 中有了别的含义,违背了设计 C++ 兼容 C 的初衷;

2,寻找新的关键字来定义类;

2,在 C++ 中提供了新的关键字 class 用于类定义;

3,class 和 struct 的用法是完全相同的,但只有一个本质区别,如下;

1,在使用 struct 定义类时,所有成员的默认访问级别为 public;

2,在用 class 定义类时,所有成员的默认访问级别为 private;

3,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 = ; printf("a.getI() = %d\n", a.getI()); b.i = ; printf("b.getI() = %d\n", b.getI()); return ;
}

4,小实例:

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

1,提供 setOperator 函数设置运算类型;

2,提供 setParameter 函数设置运算参数;

3,提供 result 函数进行运算:

1,其返回值表示运算的合法性;

2,通过引用参数返回结果;

2,客户关心使用、不关心实现、简单易用就好,类的开发者关心类如何实现、内部实现方式;

3,既然类分为外部接口(使用方式)和内部实现(实现细节)两部分,则最终的源代码上也应该有所体现;

5,类的真正形态:

1,C++ 中的类支持声明(类的使用方式)和实现(类实现的内部细节)的分离;

2,使用头文件和源文件的方式来将类的实现和定义分开:

1,*.h 头文件中只有类的声明:

1,成员变量和成员函数的声明,不包括成员函数体的实现;

2,*.cpp 源文件中完成类的其它实现:

1,成员函数的具体实现;

6,Operator 类的分析:

1,*.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

1,仅仅是类的声明而已,表达的也就是用户的需求,仅仅是如何使用这个类;

2,*.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;

1,考虑的是这个类的这些函数功能该如何实现;

3,类的使用:

 #include <stdio.h>
#include "Operator.h" int main()
{
Operator op;
double r = ; op.setOperator('/');
op.setParameter(, ); if( op.result(r) )
{
printf("r = %lf\n", r);
}
else
{
printf("Calculate error!\n");
} return ;
}

1,编写 main() 函数的函数体时,其实是在使用一个类,但是没有关心它是怎么实现的,仅仅是调用公开的成员函数这些公开的成员函数就是这个 Operator 类的使用方式;

2,使用类的方式:定义这个类的对象并通过对象来调用共有成员变量或者成员函数;

7,小结:

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

1,从此后只使用 class 定义类(一般的);

2,struct 只用来表示变量的集合(一般的),代表一个结构体;

2,struct 和 class 的区别在于默认访问级别的不同;

3,C++ 中的类支持声明和实现的分离,意义在于分两个角度来看待类,一个是声明的角度、一个是实现的角度:

1,在头文件中声明类;

1,类的使用方式;

2,在源文件中实现类;

1,类的实现细节;

3,在具体开发中,在 C++ 的头文件里面来做类的声明,在 C++ 的源文件里面来做类的具体实现;

C++中的class和struct区别的更多相关文章

  1. C#中 const 和 readonly 的区别

    C#中 const 和 readonly 的区别 来源 https://www.cnblogs.com/gsk99/archive/2008/10/10/1308299.html http://dev ...

  2. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  3. (转)C#中String跟string的“区别”

    string是c#中的类,String是.net Framework的类(在C# IDE中不会显示蓝色) C# string映射为.net Framework的String 如果用string,编译器 ...

  4. 【转】为什么我们都理解错了HTTP中GET与POST的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  5. Visual Studio 中 Build 和 Rebuild 的区别

    因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...

  6. SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...

  7. java集合中List与set的区别

       java集合中List与set的区别.     List可以存储元素为有序性并且元素可以相同.     set存储元素为无序性并且元素不可以相同.     下面贴几段代码感受一下: ArrayL ...

  8. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  9. oracle中函数和存储过程的区别和联系【转载竹沥半夏】

    oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...

随机推荐

  1. mssql因为手贱修改了服务配置的最大内存,造成无法启动

    mssql数据库设置内存太小,造成无法启动服务. 解决办法: 1.用命令行形式启动最精简版的mssql服务,另外再用一个新的命令行去修改配置,将内存设置为无限制.  命令行要记得用管理员身份运行比较稳 ...

  2. js 中使用typeof

    >typeof(null) <"object" 对null执行typeof预算,结果返回字符串'object',也就是说,可以将null认为是一个特殊的对象值,含义是“ ...

  3. spring boot 配置HTTPS

    spring boot 版本是<version>1.5.8.RELEASE</version> 1.配置文件里,看下不要有空格=[不要有空格] 2.别名 =========== ...

  4. k8-s存储

    原文 https://mp.weixin.qq.com/s/6yg_bt5mYKWdXS0CidY6Rg 从用户角度看,存储就是一块盘或者一个目录,用户不关心盘或者目录如何实现,用户要求非常" ...

  5. python实现的ocr接口

    太累了,,有时间再补解释 import pytesseract import requests from PIL import Image from PIL import ImageFilter fr ...

  6. luogu P1314 聪明的质监员 x

    P1314 聪明的质监员(至于为什么选择这个题目,可能是我觉得比较好玩呗) 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自 ...

  7. 【Dart学习】-- Dart之消息循环机制[翻译]

    概述 异步任务在Dart中随处可见,例如许多库的方法调用都会返回Future对象来实现异步处理,我们也可以注册Handler来响应一些事件,如:鼠标点击事件,I/O流结束和定时器到期. 这篇文章主要介 ...

  8. selenium,控制滚动条

    今天写selenium用例的时候,遇见奇葩的问题,FF下是没有错误的,但是在chrome和ie下就会有问题,后来发现是 操作中点击一个按钮,在页面不可见,就会导致异常,解决方法如下: element ...

  9. Ubuntu 16.04修改ssh端口

    1 安装防火墙 sudo apt-get install ufw启用 sudo ufw enable sudo ufw default deny 作用:开启了防火墙并随系统启动同时关闭所有外部对本机的 ...

  10. JAVA周二学习总结

    第一周我感觉我学到了不少东西,其中有上学期C语言学的不好的原因,因为不想再挂科就有认真的在听. 学到的东西有JAVA的基本书写模式自己懂了,还在课堂上弄会了交换数据的方法,还有运算的算法,另外还有数据 ...