C++入门:C语言到C++的过渡

目录

前言:C++——为弥补C缺陷而生的语言

C++的输入与输出   

  1.引子:C++的第一个程序

  2.C++的输入与输出

3.命名空间

疑难解答

1.对输入输出流的一个基本概念

2.从流当中存入及提取数据


前言:C++——为弥补C缺陷而生的语言

        C++起源于 1979 年,当时 Bjarne Stroustrup 在贝尔实验室工作,面对复杂软件开发任务,他感到 C 语言在表达能力、可维护性和可扩展性方面存在不足。

        1983 年,Bjarne Stroustrup 在 C 语言基础上添加面向对象编程特性,设计出 C++雏形,有了类、封装、继承等核心概念。因此,C++是兼容了C语言的(用过Dev-C++的同学应该不难理解,文件后缀明明是.cpp却可以编译C语言)。

        C++的标准化工作于 1989 年开始,1994 年提出第一个标准化草案。之后联合标准化委员会投票通过将惠普实验室开发的 STL 包含到 C++标准中,这延缓了 C++标准化进程。

        1997 年 11 月 14 日,通过最终草案,1998 年,C++的 ANSI/IS0 标准投入使用。总之,C++是在 C 语言基础上发展而来,弥补了 C 语言的一些不足。

        该文将深入剖析cout和cin两个基本的输入输出函数及其对应运算符,阐述输入输出流的概念,为日后的学习打下牢靠基础。

C++的输入与输出   

  1.引子:C++的第一个程序

        按照传统惯例,第一个程序当然是Hello World了。我们来写一下代码:

// 这⾥的std cout等看不懂没关系,下⾯我们会依次讲解
#include<iostream>
using namespace std;
int main()
{
    cout << "hello world\n" << endl;
    return 0;
}

        虽然还没学过,但相信以你的聪明才智,不难看出cout就是输出语句吧。下面我们来正式学习一下。

  2.C++的输入与输出

  • 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输 出对象。
  •  std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输 ⼊流。
  •  std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
  •  std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
  •  <<是流插入运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)(疑难解答2)
  •  使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊ 输出可以⾃动识别变量类型,其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出。(疑难解答1)
  •  cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使⽤⽅式去⽤他们。
  •  这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,这是因为<iostream>间接包含了<stdio.h>。vs系列编译器是这样的,其他编译器可能会报错。

        好,下面让我们自己动手来写一个简单程序吧:

#include <iostream>
int main() {
    int num;
    std::cout << "请输入一个整数: ";
    std::cin >> num;
    std::cout << "您输入的整数是: " << num << std::endl;
    return 0;
}

                           等等!为什么你的cout没有用endl就输出了?

        在默认情况下,使用 std::cout 进行输出时,如果后面没有其他的输出操作紧跟,或者程序没有结束,输出通常会立即显示在屏幕上。

        这是因为输出流有一个默认的刷新机制,对于一些简单的输出语句,即使没有手动使用 std::endl 或其他强制刷新的操作,系统也会适时地将输出内容发送到屏幕上,以提供及时的反馈。

        但如果在复杂的程序环境中,或者有大量的连续输出操作,为了确保输出的及时性和准确性,使用 std::endl 或其他刷新缓冲区的操作会更加可靠。

            那还有!为什么你的Hello用的是cout,这里却变成了std::cout?

        问得好!这个就涉及到命名空间的问题了。你没发现这个程序比上一个程序还少了一个using namespace std;吗?

3.命名空间

        在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的。

        namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,这样可以避免命名冲突。

        在使用命名空间中的变量时,可以using namespace 命名空间,这样我们在使用命名空间的域中就可以使用该命名空间中的变量和函数;也可以是命名空间::变量名,这样虽是麻烦些,却有效避免了不同域中相同变量名冲突的情况。

        举个例子:

        这是我们直接用using namespace 的情况,我们主函数就可以使用命名空间bit_le的变量了。

#include <iostream>
namespace bit_le//创建一个命名空间
{
	int a=798;
}
int main() 
{
	using namespace bit_le;
	std::cout<<a;
    return 0;
}

        结果如下:

         另一种方法如下:

#include <iostream>
namespace bit_le//创建一个命名空间
{
	int a=798;
}
int main() 
{
	int a=666;
	std::cout<<a<<std::endl;//输出主函数域中的a
	std::cout<<bit_le::a;//输出命名空间“bit_le”中的a
    return 0;
}

         结果如下:

        最后,不得不提的⼀般⽇常练习中我们可以using namespace,实际项目开发中不建议using namespace。

        为什么呢?明明看起来直接using namespace一下更简单。这是因为在做复杂项目时,变量名容易重复,导致冲突。我们再举例:

        所以在写较长项目的时候,多敲几下,避免因为冲突造成的bug。

疑难解答

1.对输入输出流的一个基本概念

    在编程中,“流”(Stream)是一种用于处理数据输入和输出的抽象概念

        可以把流想象成一条数据的“河流”,数据在其中连续地流动。

从功能角度来看:

  • 流提供了一种统一的方式来处理不同来源和去向的数据。
  • 无论是从文件读取数据、从网络接收数据、从键盘获取用户输入,还是向屏幕输出、向文件写入数据等,都可以通过流来实现。

从特点角度来看:

  • 流具有连续性和顺序性。数据按照一定的顺序依次通过流进行传输。
  • 流可以是字节流(处理原始的字节数据)或字符流(处理字符数据)。

        在 C++ 中,输入流用于从数据源获取数据,输出流用于将数据发送到数据目的地。

        例如,std::cin 是标准输入流,它可以从键盘获取用户输入的数据。而 std::cout 是标准输出流,用于将数据输出到屏幕。

        流的操作通常具有缓冲机制。这意味着数据可能不会立即被发送或接收,而是先存储在缓冲区中,等到缓冲区满或者遇到特定的刷新操作(如 std::endl)时,才进行实际的传输。

        在文件操作中,std::ifstream 用于读取文件,std::ofstream 用于写入文件,它们也被视为流。

        总的来说,流的概念使得数据的输入和输出处理更加方便、灵活和统一,有助于提高编程的效率和可维护性。

2.从流当中存入及提取数据

        不知道你看完流的概念有没有一个疑惑,反正我学的时候是有的。问题如下:

        我们在使用cout函数进行输出时,似乎并没有向流中存入数据。怎么就从流中提取出来了呢?

        使用 cout 进行输出时,实际上并不是没有事先存入数据。

   cout 是输出流对象,它的工作方式是在您使用插入运算符 << 向它提供数据时,将数据暂时存储在内部的缓冲区中。

        当遇到特定的情况,比如输出换行符 '\n' 、遇到程序结束、缓冲区满或者手动调用刷新缓冲区的操作(如 std::endl)时,存储在缓冲区中的数据才会被实际输出到目标设备(通常是屏幕)。

        所以,虽然看起来是直接进行了输出,但实际上是先将数据存入了缓冲区,只是这个过程对于您来说是自动和隐式处理的。

         我们来举个例子:

#include <iostream>

int main() {
    std::cout << "Hello";  // 数据暂时存储在缓冲区
    sleep(5);//停留5秒程序接着运行
    std::cout << " World";  // 数据继续存储在缓冲区
    std::cout << std::endl;  // 遇到换行符,刷新缓冲区,输出之前存储的数据
    return 0;
}

        嗯~好,这上个问题刚解决,下个问题就出来了。

        明明“out”是“出”,“in”是“入”。你说cout是插入用的,那cin是干嘛的?口说无凭,你得给我证明!

        cout的确是输出语句,但要先用“<<”将内容存入流。遇到std::endl时输出之前存入的数据(什么?你说你经常不加endl也正常输出了?别急,马上讲)。

        cin是输出语句,用“>>”将流中的数据赋值给变量。例如,如果要从标准输入读取一个整数并存储到变量 num 中,我们会这样写:cin >> num ,这里就像是从输入流中把数据“拉出来”并存放到 num 里。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序--24(列表渲染)

一、wx&#xff1a;for 1.作用 根据指定数组&#xff0c;循环渲染重复的组件结构 2.语法 <view wx:for"{{data中的数据}}"> 索引是&#xff1a;{{index}}, item项是&#xff1a;{{item}}</view> index:表索引item&#xff1a;表当前循环项 …

全国产化服务器:飞腾FT2000+/64核密集计算、显控及存储一体式加固服务器

飞腾FT2000/64核的加固服务器是一款专为高安全性、高可靠性及能在严苛环境下稳定运行而设计的服务器产品。以下是对该服务器的详细介绍&#xff1a; 一、处理器与核心组件 处理器&#xff1a;搭载飞腾FT2000/64核处理器&#xff0c;该处理器基于ARM架构&#xff0c;集成了64个…

KubeSphere核心实战_kubesphere部署redis01_为redis指定配置文件_指定存储卷_配置服务---分布式云原生部署架构搭建047

然后我们再来,部署一下redis,可以看到,首先去容器官网去找到对应的redis的镜像然后 可以看到镜像中都有说的,如何启动,以及 --appendonly yes 是指定持久化.然后 /data表示数据存储的位置. 可以看到数据存储位置 然后还有配置文件的位置. 可以看到,我们首先去创建配置文件,然后…

SQL进阶技巧:多维分析之如何还原任意维度组合下的维度列簇名称?【利用grouping_id逆向分析】

目 录 0 需求描述 1 数据准备 2 问题分析 3 小结 0 需求描述 现有用户访问日志表 visit_log ,每一行数据表示一条用户访问日志。 需求: (1)按照如下维度组合 (province), (province, city), (province, city, device_type) 计算用户访问量,要求一条SQL语句统计所所…

【Spring Boot】全局异常处理

目录 背景 前言 设计步骤 1.定义异常信息类&#xff1a; 2.自定义异常&#xff1a; 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中&#xff0c;如何处理全局异常的&#xff0c;也就是如何捕获全局异…

微服务及安全

一、微服务的原理 1.什么是微服务架构 微服务架构区别于传统的单体软件架构,是一种为了适应当前互联网后台服务的「三高需求:高并发、高性能、高可用」而产生的的软件架构。 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( Monolithic application ),…

Nginx源码安装与进阶负载均衡

目录 一 web服务介绍 二 Nginx介绍与源码安装 2.1 nginx源码安装 2.2 平滑升级和回滚 三 配置文件详解 3.1 配置文件说明 3.2 全局配置与http模块 3.3 root与alias 3.4 location的介绍 3.5 账户认证 四 高级配置 4.1 nginx 压缩功能 4.2 变量介绍 五 nginx反向代…

电脑硬盘坏了怎么恢复数据?

在数字化时代&#xff0c;电脑硬盘作为存储核心&#xff0c;承载着我们的工作文档、学习资料、家庭照片以及无数珍贵的回忆。然而&#xff0c;硬盘作为机械设备&#xff0c;也有其寿命和脆弱性&#xff0c;一旦出现故障&#xff0c;数据恢复便成为了一个紧迫而棘手的问题。本文…

电路板中的MARK点

什么是mark点&#xff0c;什么情况下有mark点 Mark点的种类 局部mark点&#xff1a;针对那些 引脚数量众多 引脚间距非常紧凑的元器件 比如说QFT封装 BGA封装 MARK点的作用 不论是 拼版还是全局mark 一般都会放上2-3个点 第三个mark点一般用于比较大的电路板或者是比较大的拼…

【Linux】 gdb-调试器初入门(简单版使用)

&#x1f525;系列文章&#xff1a;《Linux入门》 目录 一、背景 二、什么是GDB &#x1f337;定义 &#x1f337;GDB调试工具---提供的帮助 三、GDB的安装教程-Ubuntu &#x1f337;gdb的安装 四、哪类程序可被调试 &#x1f337;程序的发布方式 &#x1f337;Debug版…

【吊打面试官系列-Memcached面试题】memcached 如何实现冗余机制?

大家好&#xff0c;我是锋哥。今天分享关于 【memcached 如何实现冗余机制&#xff1f; 】面试题&#xff0c;希望对大家有帮助&#xff1b; memcached 如何实现冗余机制&#xff1f; 不实现&#xff01;我们对这个问题感到很惊讶。Memcached 应该是应用的缓存层。它的设计本身…

ETAS工具链自动化实战指南<一>

----自动化不仅是一种技术&#xff0c;更是一种思维方式&#xff0c;它将帮助我们在快节奏的工作环境中保持领先&#xff01; 目录 往期推荐 场景一&#xff1a;SWC 之间 port自动连接 命令示例 参数说明 场景二&#xff1a;SWC与ECU 自动映射 命令示例 参数说明 场景三&…

【Linux学习】Linux开发工具——vim

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;Linux学习 目录 &#x1f308;前言&#x1f525;vim的基本概念&#x1f525;vim的基本操作&#x1f525;vim命令模式的命令集&#x1f525;简单vim配置⭐一键配置美观的vim安装方法卸载方…

瓜子二手车源码开发

瓜子二手车作为国内知名的二手车交易平台&#xff0c;其开发需求与功能架构主要围绕提升用户体验、保障交易安全、优化交易流程以及提供全面服务等方面展开。以下是对瓜子二手车开发需求与功能架构的详细分析 一、开发需求 用户需求&#xff1a; 便捷性&#xff1a;用户希望能…

Qt 0820作业

一、思维导图 二、闹钟 头文件代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> //时间类 #include <QTimer> //时间事件类 #include <QTimerEvent> //定时器事件类 #include <QMouseEvent> //鼠标…

VS2019安装VisualAssist后菜单不显示的问题

1、参考链接 解决vs2019/vs2022安装成功Visual Assist/qt tools后, vs菜单栏的扩展中不显示相应插件的问题_qt安装后 vs扩展中没有-CSDN博客 这个链接有类似的解答。 但是讲解的不够详细&#xff0c;下面是我的实操步骤&#xff0c;供大家参考。 2、重命名privateregistry.bi…

数据埋点系列总结|从基础到实践的深度总结

在当今数字化时代,数据已成为企业的核心资产,而数据驱动决策则是充分利用这一资产的关键方法。本系列文章全面探讨了从数据收集到分析,再到实际应用的整个过程,为读者提供了深入而实用的指导。让我们深入回顾这个journey,详细探讨每个主题的核心内容,并思考数据驱动决策的未来发…

Ubuntu网络服务无法启动问题

问题 Ubuntu20.04卡死重启后网络服务打不开&#xff0c;没有下图中的有线一栏&#xff1a; 查看网络服务状态如下&#xff1a; systemctl status NetworkManager此时桌面右上角没有下图中网络图标&#xff1a; 解决 命令&#xff1a; sudo service network-manager sto…

Excel如何快速比对两列数值是否相等

好文章百度安全验证 推荐选中全部数据&#xff0c;条件格式——突出显示----重复值

MT7621+MT7915(MT7905)+MT7975 (W7621A6G-SDK)编译固件与升级固件方法

一、搭建开发环境&#xff0c;编译固件。 1、安装在Ubuntu 14.04.5 x86_64系统后&#xff0c;然后安装下面命令行。 $ sudo apt-get install git g make libncurses5-dev subversion libssl-dev gawk libxml-parser-perl unzip wget python xz-utils vim zlibc zlib1g zlib1g…