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. git windows下换行符问题

    不同操系统下的换行符 CR回车 LF换行 Windows/Dos CRLF \r\n Linux/Unix LF \n MacOS CR \r 1.执行git config --get core.au ...

  2. 文件操作:rewind()

    函数名: rewind() 功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头   注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动 ...

  3. Luogu P2678 跳石头

    题目链接:Click here Solution: 最小值最大,显然二分,二分出mid后贪心去除石头,判断m次内是否可行即可 Code: #include<bits/stdc++.h> # ...

  4. Vue(核心思想)

    1.Es6语法普及 let和var的区别: var:定义变量时,在全局范围内都有效;所以在变量没有声明之前就能使用,值为undefined, 称为变量提升; let:声明的变量一定要在声明后使用,而且 ...

  5. ApiException

    ApiException 用于在catch中throw 异常,可以添加异常信息, throw new ApiException("线下绑卡异常!"); public class A ...

  6. wannafly 挑战赛8 E 小G的项链(manecher)

    链接:https://www.nowcoder.com/acm/contest/57/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...

  7. CodeChef-----February Challenge 2018---Broken Clock(极坐标+三角函数递推+矩阵快速幂)

    链接:  https://www.codechef.com/FEB18/problems/BROCLK Broken Clock Problem Code: BROCLK Chef has a clo ...

  8. Redis大key的发现与删除方法全解析

    个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...

  9. iptables添加、删除端口

    简洁才是王道, 下面是添加一个udp端口,端口号8566,即接收到8566端口的所有udp包 /sbin/iptables -I INPUT -p udp --dport -j ACCEPT 要删除这 ...

  10. ubuntu 18.04 gcc g++降级4.8版

    $ sudo apt-get install -y gcc-4.8 $ sudo apt-get install -y g++-4.8 $ cd /usr/bin $ sudo rm gcc $ su ...