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. 【leetcode】Increasing Triplet Subsequence

    Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...

  2. mysql 发现 navicat 可以远程连接,代码无法远程连接

    navicat可以远程连接, root账号也可以用代码连接. 其他的用户无法远程连接. 原因: 1.先检查下 mysql数据库里面 的 servers 表是否存在. 2.更新或者创建用户之后 使用:  ...

  3. Elasticsearch:aggregation介绍

    聚合(aggregation)功能集是整个Elasticsearch产品中最令人兴奋和有益的功能之一,主要是因为它提供了一个非常有吸引力对之前的facets的替代. 在本教程中,我们将解释Elasti ...

  4. lazarus 线程调试

    lazarus站点的文档中看到的.简单用法: uses  LCLProc; DbgOutThreadLog (msg: string);  overload;  --有好几个不同参数的定义.

  5. 模板_BIT

    #include<bits/stdc++.h> #define maxn 500005 //#define int long long using namespace std; inlin ...

  6. tp3.2 页面Windows正常 linux异常,页面找不到

    这个问题主要是tp3.2 在读取控制器里的方法时,会把方法自动转为小写, 然后去对应view成找html文件,自然找不到. class textController extends ComContro ...

  7. React Native商城项目实战06 - 设置安卓中的启动页

    1.Main 目录下新建LaunchImage.js: /** * 启动页 */ import React, { Component } from 'react'; import { AppRegis ...

  8. C++中cout输出字符串和字符串型指针地址值的方法以及C语言中的printf用法比较

    #include <iostream> using namespace std; #include <stdio.h> int main() { char *pstr = &q ...

  9. DB2创建视图并授权给其他用户

    创建视图并授权给其他用户 可以在操作系统界面.或者DB2交互界面下进行数据库操作 查看数据库节点[db2inst1@ELONEHR-DB ~]$ db2 list db directory Syste ...

  10. Latex常用公式整理

    目录 常用 常用数学公式 常用希腊字母 说明:博客园中的Latex编辑是以$ latex公式 $,为边界. 1.常用 描述 Latex公式 表达式 下标 x_2 x2 上标 x^2 x2  分数 \f ...