C++中的class和struct区别
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区别的更多相关文章
- C#中 const 和 readonly 的区别
C#中 const 和 readonly 的区别 来源 https://www.cnblogs.com/gsk99/archive/2008/10/10/1308299.html http://dev ...
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
浅谈c#的三个高级参数ref out 和Params c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...
- (转)C#中String跟string的“区别”
string是c#中的类,String是.net Framework的类(在C# IDE中不会显示蓝色) C# string映射为.net Framework的String 如果用string,编译器 ...
- 【转】为什么我们都理解错了HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- Visual Studio 中 Build 和 Rebuild 的区别
因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...
- java集合中List与set的区别
java集合中List与set的区别. List可以存储元素为有序性并且元素可以相同. set存储元素为无序性并且元素不可以相同. 下面贴几段代码感受一下: ArrayL ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- oracle中函数和存储过程的区别和联系【转载竹沥半夏】
oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...
随机推荐
- Levenberg-Marquardt优化和zipf分布
最近审论文和看报告中遇到LM优化和齐普夫分布,于是查了一下. LM方法是高斯牛顿迭代方法的改进,下面分别是高斯牛顿.齐普夫方法的公式: Δ=−(JfTJf)−1JfTf,Δ=−(JfTJf+λI)−1 ...
- 【NOIP2016提高A组五校联考1】排队
题目 分析 首先预处理出每个点的优先级,当有一个人进入时,一定会走到优先级最大的空房间中. 把所有空的房间扔到一个堆中,按优先级大小维护这个堆. 答案怎么求就不说了,很容易想到,就只讲操作吧. 对于第 ...
- chrome浏览器调试js,结果Sources里面找不到js文件解决办法
页面出现问题,就debug,这是前端开发工程师最常见的做法,但是有时候,我们打开开发者工具,在sources查找js文件,却发现怎么也找不到,无法设置断点.但是文件在network选项卡里确实 ...
- jquery gt选择器 语法
jquery gt选择器 语法 作用::gt 选择器选取 index 值高于指定数的元素.index 值从 0 开始.经常与其他元素/选择器一起使用,来选择指定的组中特定序号之后的元素(如上面的例子) ...
- html applet标签 语法
html applet标签 语法 作用:定义嵌入的 applet. 说明:某些浏览器中依然存在对 <applet> 但是需要额外的插件和安装过程才能起作用.大理石机械构件 注释:HTML5 ...
- MySQL_DDL操作
简单的来说DLL就是对数据库的C(Create)R(Retrieve)U(Update)D(Delete) 1.数据库的创建 (1)创建:create database 数据库名:当数据库已经存在则会 ...
- D5000系统使用手册--AVC
有关概念: AVC:自动电压控制 PAS:网络分析应用 SCADA:电网稳态监控应用 闭环:AVC由SCADA系统获得电网的实时运行状态,分析计算后发出控制指令,电网运行状态变化后反馈回AVC,形成闭 ...
- [BZOJ4456][ZJOI2016]旅行者:分治+最短路
分析 类似于点分治的思想,只统计经过分割线的最短路,然后把地图一分为二. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(regist ...
- [BZOJ2987]Earthquake:类欧几里得算法
分析 类欧的式子到底是谁推的啊怎么这么神仙啊orz! 简单说一下这道题,题目中的约束条件可以转化为: \[ y \leq \frac{c-ax}{b} \] 有负数怎么办啊?转化一下: \[ y \l ...
- formData和input的file结合使用
<form method="POST" id="uploadForm" enctype="multipart/form-data"&g ...