C++_03_C++的增强

本人亦可见

一、C++相较于C,实用性增强

1、C++相较于C,全局变量检查增强

#include<stdio.h>
int m=20;    //先定义
int m;       //再声明
int main()
{printf("m = %d\n",m);  //m=20return 0;
}
//严格意义上来说,先定义后声明是错误的逻辑
//但是C语言作为弱语法语言,对于先定义再声明的逻辑检查就没有那么严格;
//在C语言里,虽然这样写编译器不会报错,但是不要这样写
//先定义,后再声明,那这个声明根本没有任何意义
#include<iostream>
using namespace std;
int n = 34;
int n;            //err
int main()
{cout << n << endl;  //errreturn 0;
}
//C++不允许出现先定义再声明的情况,
//因为这是个错误的逻辑,C++针对这方面很严谨,作为强语法语言,全局变量检查得到增强

  C++的全局变量检测更强,部分代码出现全局变量先定义,后再声明的情况,C语言作为弱检测性语言,不会检测出错误;但是C++是强检测性语言会检测出更多的错误和语法逻辑问题

2、C++相较于C,C++在定义和使用变量的时候更”实用“

  C语言中的变量理论上都必须在作用域开始的位置定义!!即:必须先全部定义初始化完成后在使用;而不能先定义一部分,在执行后面语句的时候突然想起再定义。(理论上是不可以的,但部分编译器也会编译通过)

  C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。随时需要的时候再随时定义即可。

  简单来讲就是C语言比较讲规矩,墨守成规,大家默认的规则就是先在指定的地方集中先定义初始化,后面在直接用;而C++比较机灵,C++的一切行径都是为了实用而不是为了美观或者规范,因为大家编代码的时候,可能你并不知道你后面会用到那些变量,扎堆定义确实是比较麻烦的,当然也是美观度,但是不够实用。

  C++就是最求实用,比如在for循环中 for(int i=0;i<10;i++)  在C++中是完全没问题的,但是在C语言里,直接在循环里定义变量就可能会报错了。

3、C++相较于C,所有变量和函数必须有类型

  C++中任何函数和变量一定要声明类型,但C语言有时候没有明确声明也能变异通过

4、C++相较于C,具备更严格的类型转换

  C++具有更严格的类型转换,C++不允许不同类型的变量直接赋值,必须正确转换

二、C++的类中为什么需要引入成员函数的概念?

   我们都知道C++中的类(class)和C语言中的结构体有异曲同工之妙,但是类中多了一种类型:“函数”。是的,被称为“成员函数”。

#include<iostream>
using namespace std;//c++的命名空间
class circle
{
public:double r;double pi = 3.1415926;double area = pi*r*r;
};// 2010编译不通过 但是在2013编译器能编译通过
int main()
{circle c1;cout << "please input your r" << endl;cin >> c1.r;//area不是等价于公式,而是计算出来的一个值cout << c1.area << endl;    //乱码system("pause");return 0;
}

  看如上例子:这个代码实际上编译只有两种结果,要么直接编译不通过,要么编译通过,但结果与实际值不相符(结果随机)!
分析:1、首先类是不占用内存空间的,当定义一个对象c1的时候,成员变量全部分配空间并完成初始化,r为随机值,pi为3.1415926,area直接计算不保留等号右边的算式,因为r随机,那么area自然也是随机值。
   2、后面再输入的r值并不会印象area的结果,因为公式在输入r值之前就已经消失了。那么公式就失去的原本的作用;
     3、因此:结论:在类中只适合直接定义变量(成员变量),如果要定义方法则需要借助成员函数来定义实现。

#include<iostream>
using namespace std;class A
{
public:int length;int breadth;int height;int fun();  //成员函数声明private:};int main()
{A asd;asd.fun();return 0;
}//成员函数定义:
//        这里引用成员函数的意义就是让计算方法在类的内部再进行一层封装;
//        这样创建的对象还会保留计算方法本身
// 反而不定义成员函数:
//        直接在类内进行计算方法定义,在创建对象的时候会被计算为等式左值,计算方法不会保留
int A::fun()  
{cout << "请分别输入长、宽、高:" << endl;cin >> length >> breadth >> height;int V = length * breadth * height;cout <<"体积:"<< V << endl;return 0;
}

三、C++和C中register的意义

  register关键字 :修饰变量,请求编译器让变量a直接放在寄存器里面,速度快(注意只是请求建议,register没有资格强迫编译器这么做)
  1、在c语言中 register修饰的变量不能取地址(&a),c编译器不会甄别优化,一般会按照你的建议去干,放在寄存器上的变量不能取地址。(和内存的存储结构和机制有差异)
  2、在c++里面可以取register变量的地址,当你要取register地址的时候,编译器会使register对变量的声明变得无效,因此变量依旧存储在内存上,可以取内存地址。
    3、c++编译器比较智能,会甄别和优化,当需要存在寄存器上时,即使不加register(就是即使没有建议这么干),编译器也会将变量存储至寄存器;相反当没有必要的时候,即使你强加了register声明,编译器也不会照做。甚至如上情况,register被采纳通过了,但是当发现你要取地址的时候,立马让其无效不通过,怎么样,是不是很灵活智能!

 四、struct关键字在C++和C语言中的差异

  在C++中struct关键字类型相较于C语言中,功能得到增强 !

struct teacher
{char name[32];int age;
};
/*
typedef struct teacher         //作为替换方法typedef不是关注点,但是我也附上
{char name[32];int age;
}teacher;
*///关注点:
struct teacher ang;   //C语言可用  C++可用       
//C原因必须带上struct teacher 整体作为数据类型名teacher ang;         //C++可用                  
/** C++ 不要求必须有struct , teacher 就可以作为数据类型名,但是还是建议写上struct毕竟C语言用法已经习惯了。
*/

上面的代码例子:

  C语言struct用法:缺少struct——不行;typedef替换——也是整体替换而不是单独省掉struct
        1、struct teacher ach;    struct必不可缺,否者C编译器不识别为数据类型
        2、使用typedef  ,将struct  teacher作为类型名整体替换为新类型名,但即便是这样,C语言中struct依旧不可被单独撇下

       C ++  struct用法:C语言能行的都行,C语言不允许的也可以

  C语言结构体只能定义变量,但是C++的结构体既可以定义变量,也可以定义函数

  五、bool数据类型在C++和C语言中的差异

  布尔类型(bool)是 C++ 新增的一种基本数据类型。在标准的 C语言中没有那个数据类型可以直接定义bool数据。

即:如下代码只能在C++中这样定义,而C语言中不行(C语言中没有bool的定义类型)

bool b1 = true;
bool b2 = false;
bool b3 = 1;
bool b4 = 0;
bool b5 = 54;              //C++可以赋值true、false  也可以赋值 1、0、54(任意数)

在C语言中如果需要使用 bool 类型,程序员可以通过宏定义来自定义一个 bool 类型,定义语句如下:

#define bool int
#define false 0  //C语言不能使用false、true;并且数据类型一般是int型,没有bool型的定义法
#define true 1

也就是将 int 型定义为 bool 型,将 int 型的 0 和 1 两个值分别定义为 bool 类型的两个值 true 和 false。但是在 C++ 中则不需要这么麻烦,C++ 中对 bool 类型已经做出了定义。

六、三目运算符功能增强(C和C++编译器的表现)

//03-左值.c
#include<stdio.h>int main_03()
{int a = 10;int b = 20;//C语言内,左边返回的是常亮10 ;false(a < b ? a : b) = 30; //errprintf("a = %d, b = %d\n", a, b);return 0;
}
//03-左值.cpp
#include<iostream>
using namespace std;int main_03()
{int a = 10;int b = 20;//C++内,三目运算符 左边返回的是变量 a ;true(a < b ? a : b) = 30; //a = 30cout <<"a = "<< a <<"\t"<< "b = " << b << endl;//a = 30  b = 20system("pause");return 0;
}

结论

1、C语言返回变量的值                C++语言是返回变量本身
    C语言中的三目运算符返回的是变量值10,不能作为左值使用*(返回的变量值不能立即被赋值)
    C++中的三目运算符可直接返回变量本身a,因此可以出现在程序的任何地方

2、注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
    (a < b ? 10 : b )= 30;

3、C语言如何支持类似C++的特性呢?
    当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已

七、面向过程语言和面向对象语言初识

1、C语言是面向过程的语言;
       核心思想:功能分解、自顶向下、逐层细化( 程序=数据结构+算法 )
       数据结构:对数据的存储方法(数据类型、数组、链表、树等)
       算法:对存储好的数据,进行分析的步骤,操作数据的步骤。
2、C++语言既可以面向过程,也可以面向对象进行程序设计;
       比C语言更适合大型的程序设计;具备:继承、封装、多态的特性;
       在C++的概念里:算法和数据结构被看做是一个整体,被称作对象;
               对象=算法+数据结构   程序=对象+对象+....+对象;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集成学习——Boosting算法:Adaboost、GBDT、XGBOOST和lightGBM的简要原理和区别

1、Boosting算法 Boosting算法是通过串联的方式&#xff0c;将一组弱学习器提升为强学习器算法。它的工作机制如下&#xff1a; &#xff08;1&#xff09;用初始训练集训练出一个基学习器&#xff1b; &#xff08;2&#xff09;依据基学习器的表现对训练样本分布进行调整&…

设计模式之命令模式

写在前面 本文看下命令设计模式。 1&#xff1a;介绍 1.1&#xff1a;什么时候使用命令设计模式 如果某个对象依赖于外部传入的具体参数来执行具体的操作时&#xff0c;就可以考虑使用命令设计模式&#xff0c;如空调的制冷&#xff0c;制热&#xff0c;小爱同学的唱歌&…

opencv 图像距离变换 distanceTransform

图像距离变换&#xff1a;计算图像中每一个非零点距离离自己最近的零点的距离&#xff0c;然后通过二值化0与非0绘制图像。 #include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dst…

洛必达法则和分部积分的应用之计算数学期望EX--概率论浙大版填坑记

如下图所示&#xff0c;概率论与数理统计浙大第四版有如下例题&#xff1a; 简单说就是&#xff1a;已知两个相互独立工作电子装置寿命的概率密度函数&#xff0c;将二者串联成整机&#xff0c;求整机寿命的数学期望。 这个题目解答中的微积分部分可谓是相当的坑爹&#xff0c;…

Jenkins中sh函数的用法

在Jenkins的Pipeline中&#xff0c;sh函数的用法 用法一 单个命令字符串包括使用&#xff0c;示例如下&#xff1a; sh echo "Hello, Jenkins!"用法二 多个命令字符串包括命令列表使用&#xff0c;示例如下&#xff1a; sh echo "Step 1" echo "…

vue/cli 自定义配置

vue/cli 自定义配置 1、更改默认的端口号8080 只需要更改vue.config.js文件 1、更改默认的端口号8080 只需要更改vue.config.js文件

脑电信号处理与特征提取——4.脑电信号的预处理及数据分析要点(彭微微)

目录 四、脑电信号的预处理及数据分析要点 4.1 脑电基础知识回顾 4.2 伪迹 4.3 EEG预处理 4.3.1 滤波 4.3.2 重参考 4.3.3 分段和基线校正 4.3.4 坏段剔除 4.3.5 坏导剔除/插值 4.3.6 独立成分分析ICA 4.4 事件相关电位&#xff08;ERPs&#xff09; 4.4.1 如何获…

使用flask-sqlacodegen自动生成model实体类

使用flask-sqlacodegen自动生成model实体类 依赖库版本如下(供参考)&#xff1a; flask-sqlacodegen 1.1.7sqlalchemy 1.4.36flask-sqlalchemy 3.0.3安装依赖库 pip install -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com sqlalchem…

flutter fl_chart 柱状图 柱条数量较多 实现左右滑动 固定y轴

一、引入插件 pub.dev&#xff1a;fl_chart package - All Versions 根据项目版本&#xff0c;安装可适配的 fl_chart 版本 二、官网柱状图示例 github参数配置&#xff1a;&#xff08;x轴、y轴、边框、柱条数据、tooltip等&#xff09; https://github.com/imaNNeo/fl_c…

【LeetCode】70.爬楼梯

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2…

什么是UE像素流送,像素流推流是什么原理?

游戏开发者通常在运行游戏逻辑时会将游戏渲染到屏幕的同一台设备上来运行虚幻引擎应用&#xff0c;多人联网游戏可能会在应用程序的多个实例之间分发部分游戏逻辑&#xff0c;但每个单独的实例仍然会为自己的玩家在本地渲染游戏。即使是使用 HTML5 部署选项创建可以在 Web 浏览…

解决@Scope(“prototype“)不生效的问题

目录 Scope(“prototype“)不生效Scope(“prototype“)正确用法——解决Bean多例问题 1.问题&#xff0c;Spring管理的某个Bean需要使用多例2.问题升级3. Spring给出的解决问题的办法&#xff08;解决Bean链中某个Bean需要多例的问题&#xff09; Scope(“prototype“)不生效 …

【ribbon】Ribbon的使用与原理

负载均衡介绍 负载均衡&#xff08;Load Balance&#xff09;&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行&#xff0c;例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等&#xff0c;从而协同…

【《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》——指导你使用Go语言构建健壮的、生产级别的应用程序】

谷歌在2009年发布了Go编程语言&#xff0c;并于2012年发布了1.0版。Go语言具有强大的兼容性&#xff0c;一直用于编写可扩展的重量级程序(命令行应用程序、关键基础设施工具乃至大规模分布式系统)。凭借简单性、丰富的标准库和蓬勃发展的第三方软件包生态系统&#xff0c;Go语言…

工程安全监测无线振弦采集仪在建筑物中的应用

工程安全监测无线振弦采集仪在建筑物中的应用 工程安全监测无线振弦采集仪是一种用于建筑物结构安全监测的设备&#xff0c;它采用了无线传输技术&#xff0c;具有实时性强、数据精度高等优点&#xff0c;被广泛应用于建筑物结构的实时监测和预警。下面将从设备的特点、应用场…

FPGA中RAM的结构理解

FPGA中RAM的结构理解 看代码的过程中对RAM的结构不是很理解&#xff0c;搞脑子一片浆糊&#xff0c;反复推算&#xff0c;好不容易理清了思路&#xff0c;记录下来&#xff0c;防止忘记。开辟的RAM总容量为128bytes&#xff0c;数据的位宽为32位&#xff08;即一个单元有32bit…

WebGL系列教程:WebGL入门

一、WebGL简介 1.1 概述 WebGL(全写 Web Graphics Library)是一种 3D 绘图标准,这种绘图技术标准允许把 JavaScript 和 OpenGL ES 2.0 结合在一起,通过增加 OpenGL ES 2.0 的一个 JavaScript 绑 定,WebGL 可以为 HTML5 Canvas 提供硬件 3D 加速渲染,这样 Web 开发人员就可…

WPF 如何设置全局的订阅发布事件

文章目录 前言代码逻辑修改 总结 前言 我们需要一个全局事件订阅发布功能&#xff0c;实现页面通讯。使两个毫无关系的页面通过一个中间量进行通讯。 代码 IEventAggregator&#xff1a;消息订阅集合 这个是Prism提供的消息订阅功能。使用如下 设置订阅类型&#xff0c;即…

Linux の shell 基本语法

变量 shell中变量比较特殊&#xff0c;变量名和等号之间不能有空格。其它的跟常见的变成语言类似 命名规则&#xff1a; 命名只能使用英文字母&#xff0c;数字和下划线&#xff0c;首个字符不能以数字开头。 中间不能有空格&#xff0c;可以使用下划线 _。 不能使用标点符号。…

Flask 创建文件目录,删除文件目录

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import osapp Flask(__name__) BASE_DIR os.path.abspath(os.path.dirname(__file__)) FILE_DIR os.path.join(BASE_DIR, testfile)app.route(/, methods[GET, POST]) def index():…