【C++初阶(一)】学习前言 命名空间与IO流

本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:C++
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

C++初阶(一)

  • 什么是C++
  • C++发展史
  • C++现状:
  • C++在工作领域中的应用
  • C++入门部分
    • C++关键字:
    • 命名空间:
      • 命名空间定义:
      • 命名空间的使用:
        • 方法一:加命名空间名称及作用域限定符(不展开命名空间)
        • 方法二:使用using将命名空间中某个成员引入(展开空间中部分内容)
        • 方法三:使用using namespace 命名空间名称 引入(展开空间中全部内容)
      • 对命名空间展开的思考
      • C++输入与输出:
        • cout(标准输出对象(控制台))
        • cin(标准输入对象(键盘))

什么是C++

C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

C++发展史

1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。

我们先来看下C++的历史版本:
在这里插入图片描述
现在公司主流使用还是C++98和C++11。

关于C++2X最新特性的讨论:
https://zhuanlan.zhihu.com/p/107360459

C++现状:

C/C++在TIOBE编程语言社区
常年位居前五
在23年更是霸榜前三!
在这里插入图片描述

C++在工作领域中的应用

  1. 操作系统以及大型系统软件开发
  2. 服务器端开发
  3. 游戏开发
  4. 嵌入式和物联网领域
  5. 数字图像处理
  6. 人工智能
  7. 分布式应用

C++入门部分

C++关键字:

C++总计63个关键字,C语言32个关键字。
在这里插入图片描述

命名空间:

在介绍命名空间之前,先看下面代码所示:

#include<stdio.h>int rand = 10;int main()
{printf("%d", rand);return 0;
}

这个代码很简单,实现的功能就是打印rand函数的值。(这里赋值为10.并且以全局变量定义)

那我们在这个代码实现的基础上加一个头文件:

#include<stdlib.h>

也就是说:

#include<stdio.h>
#include<stdlib.h>int rand = 10;int main()
{printf("%d", rand);return 0;
}

我们看一下在编译器中运行的结果:
在这里插入图片描述
加了个头文件后,编译器报错了,这是为什么呢?

我们看报错原因:说是rand函数重定义。这是因为在库中已经有了rand这个函数,如果再次使用rand这个名字定义变量或者函数时,编译器会分不清你到底想使用哪个rand,因而报错。

那么如何解决这个问题呢?
这就是我们要首先介绍的命名空间

C++为了解决C语言上述的问题
引出了命名空间这种玩法
(C++兼容C语言的所有语法)

命名空间定义:

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

 //NIC是命名空间的名字,一般开发中是用项目名字做命名空间名。
namespace NIC
{// 命名空间中可以定义变量/函数/类型int rand = 10;//变量int Add(int left, int right)//函数{return left + right;}struct Test//结构体{int a[10];int val;};
}

命名空间相当于一个独立的作用域
命名空间中所有内容都局限于该命名空间中

在这里插入图片描述

当然,命名空间也可以嵌套:

namespace NIC
{// 命名空间中可以定义变量/函数/类型int rand = 10;//变量int Add(int left, int right)//函数{return left + right;}struct Test//结构体{int a[10];int val;};//命名空间的嵌套:namespace NIC2{int a;int b;int sum(int x, int y){return x + y;}struct Student{int ID;char Name[20];};}
}

命名空间的使用:

那么我们回到我们最初的那个问题,既然我们现在知道了是函数冲突产生的问题,并且用命名空间解决,那么如何使用呢?

先看下面代码示例:

int main()
{printf("%d", NIC::rand);return 0;
}

我们刚才把rand函数包装在了我们的命名空间里,这里我们要打印rand的值,采用了命名空间名+::的形式,这就是使用命名空间的第一种方法:加命名空间名称及作用域限定符。

方法一:加命名空间名称及作用域限定符(不展开命名空间)

:: 域作用限定符。
通过域作用符我们就可以访问命名空间中的成员:

int main()
{printf("%d\n", NIC::rand);int b = NIC::Add(1, 3);printf("%d", b);struct NIC::Test node;return 0;
}

结果显示:
在这里插入图片描述

这个代码示例我们访问了我们命名空间里面的rand和Add函数。最后一个我们开辟了结构体的新节点。

方法二:使用using将命名空间中某个成员引入(展开空间中部分内容)

假设NIC空间中的rand使用频率很高
可以将rand变量单独展开到全局域

using NIC::rand;

假设NIC空间中的Add函数使用频率很高
可以将Add函数单独展开到全局域

using NIC::Add;

看一下测试代码:

using  NIC::rand;
int main()
{int b = rand;//rand展开直接用int c = NIC::Add(3, 5);//Add没有展开,需要用域作用符::访问printf("%d\n%d", b, c);return 0;
}

结果如下:
在这里插入图片描述

方法三:使用using namespace 命名空间名称 引入(展开空间中全部内容)

在空间NIC后面加上

using namespace NEO;

这句话的意思是:
将空间NIC展开为全局域

我们在看C++程序时经常看见:

using namespace std;

std就是C++的标准库。

当NIC空间被展开后
空间里的所有内容可以直接使用:

namespace NIC
{// 命名空间中可以定义变量/函数/类型int rand = 10;//变量int Add(int left, int right)//函数{return left + right;}struct Test//结构体{int a[10];int val;};//命名空间的嵌套:namespace NIC2{int a;int b;int sum(int x, int y){return x + y;}struct Student{int ID;char Name[20];};}
}using namespace NIC;
int main()
{int b = rand;printf("%d", b);return 0;
}

结果如下:
在这里插入图片描述

对命名空间展开的思考

假设我们将自定义NIC空间和标准库的std空间同时展开
那么整型变量rand和rand函数同时暴露在全局域
我们再去使用它时也会报错:

using namespace std;
using namespace NIC;

所以直接展开std标准库也有冲突风险
但是不展开的话,写输入输出会很麻烦

那么平时写代码时应该怎么办?
结论:

1.写项目时,尽量不要展开标准库
2.日常练习时应该展开标准库
3.写项目使用部分常用内容展开

C++输入与输出:

C语言输入输出方式,相信大家都并不陌生,那么C++如何输入输出呢?

在C++中,输入输出用的是IO流,跟C语言一样,在使用C++输入输出前要包含一个头文件:

#include<iostream>

其次,因为输入输出函数直接在库里面,我们可以直接展开std库也可以访问std库。

using namespace std;
using std::cout
using std::cin
using std::endl

具体用什么方式应人而异,根据自己习惯选择。

cout(标准输出对象(控制台))

C++中用:cout<< 来进行打印输出。(console:控制台 out:输出)
<<:流插入运算符

using std::cout;
int main()
{cout << "hello world\n";return 0;
}

输出结果:
在这里插入图片描述

从代码示例,我们可以理解为:hello word字符串就是流,流向到对象(终端)中去,进行打印输出。

补充1:
在C语言中,根据类型不同,我们用printf函数打印的时候,需要指定格式才能打印:

int main()
{int a = 10;double b = 5.5;printf("%d %.2lf", a, b);return 0;
}

但是我们C++中,会自动识别类型:

using std::cout;
int main()
{cout << "hello world\n";int a = 10;double b = 5.5;cout << a<<"\n";cout << b;return 0;
}

输出结果:
在这里插入图片描述
不仅如此:打印的时候我们可以多次用<<流插入运算符。

using std::cout;
int main()
{cout << "hello world\n";int a = 10;double b = 5.5;cout << a<<"\n"<<b<<"\n"<<"hello world\n"<<'\n';return 0;
}

输出结果:
在这里插入图片描述
补充2:
在C++中,我们可以用endl来表示换行符。(end:结尾 Line:行)

int main()
{// IO流// 自动识别输出变量的类型// <<流插入std::cout << "hello world\n";int a = 10;double b = 11.11;//std::cout << a << "\n";//std::cout << b << "\n";std::cout << a << "\n" << b << '\n';std::cout << a << std::endl << b << std::endl;return 0;
}

输出结果:
在这里插入图片描述

cin(标准输入对象(键盘))

C++中用:cin>>来进行获取键盘输入。(console:控制台 in:里面)
<<:流提取运算符

using  std::cin;
using  std::cout;
using  std::endl;
int main()
{int a;double b;// 流提取cin >> a >> b;cout << a  << endl << b << endl;cout << a << endl << b << endl;return 0;
}

输出结果:
在这里插入图片描述

注意:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,我
们可以进行网上查阅并仔细学习。

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

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

相关文章

Linux查看本机IP地址

Linux查看本机IP地址 命令 ipconfig可能会遇到的问题 Command ‘ifconfig’ not found, but can be installed with: Command ifconfig not found, but can be installed with:sudo apt install net-tools解决办法 安装net-tools再执行ipconfig 安装网络工具 sudo apt i…

Qt开发学习笔记02

将窗口设为提示框 Qt::ToolTipQt 数据库连接池 #ifndef SQLITE_H #define SQLITE_H#include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QQueue> #include <QMutex> #include <QDebug> #include "../con…

Redis之缓存一致性

Redis之缓存一致性 1 缓存更新策略1.1 内存淘汰1.2 过期删除1.3 主动更新1.4 三种缓存更新策略的对比 2 更新缓存的两种方式3 缓存更新策略的实现方式3.1 先更新DB&#xff0c;后更新缓存3.2 先更新DB&#xff0c;后删除缓存3.3 先更新缓存&#xff0c;后更新DB3.4 先删除缓存&…

二叉树的最近公共祖先

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

如何通过三行配置解决在Kubernetes中的gRPC扩展问题

一切都始于我向我们的高级软件工程师提出的一个问题&#xff1a; “忘掉通信速度。你真的觉得在gRPC中开发通信比REST更好吗&#xff1f;” 我不想听到的答案立刻就来了&#xff1a;“绝对是的。” 在我提出这个问题之前&#xff0c;我一直在监控我们的服务在滚动更新和扩展Po…

【k8s】ingress-nginx通过header路由到不同后端

K8S中ingress-nginx通过header路由到不同后端 背景 公司使用ingress-nginx作为网关的项目&#xff0c;需要在相同域名、uri&#xff0c;根据header将请求转发到不同的后端中在稳定发布的情况下&#xff0c;ingress-nginx是没有语法直接支持根据header做转发的。但是这个可以利…

【ARM Coresight 系列文章19 -- Performance Monitoring Unit(性能监测单元)

文章目录 1.1 PMU 介绍1.2 PMU 寄存器1.2.1 PMU 管理寄存器1.2.2 PMU 外设识别寄存器1.2.3 PMU 组件识别寄存器1.3 性能监控事件1.3.1 Cortex-A9 特定事件1.1 PMU 介绍 许多体系结构都包含 PMU(Performance Monitoring Unit)硬件,用于跟踪、计数系统内部的一些底层硬件事件…

[代码随想录]二叉树篇

文章目录 1. 二叉树之层序遍历1.1 144-二叉树的前序遍历1.2 94-二叉树的中序遍历1.3 145-二叉树的后序遍历1.4 102-二叉树的层序遍历1.5 107-二叉树的层序遍历II1.6 199-二叉树的右视图1.7* 637-二叉树的层平均值1.8* 429-N叉树的层序遍历1.9 515-在每个树行中找最大值1.10* 11…

k8s修改集群IP--重置集群

原来IP地址 192.168.10.138 k8s-master 192.168.10.139 k8s-node1 192.168.10.140 k8s-node2 新IP地址 192.168.10.148 k8s-master 192.168.10.149 k8s-node1 192.168.10.150 k8s-node2 cp -Rf /etc/kubernetes/ /etc/kubernetes-bak pki 证书目录保留下来&#xff1a; rm -rf …

Ubuntu18.04下载安装基于使用QT的pcl1.13+vtk8.2,以及卸载

一、QVTKWidget、QVTKWidget2、QVTKOpenGLWidget、QVTKOpenGLNativeWidget 区别 1.Qt版本 Qt5.4以前版本&#xff1a;QVTKWidget2/QVTKWidget。 Qt5.4以后版本&#xff1a;QVTKOpenGLWidget/QVTKOpenGLWidget。 2.VTK版本(Qt版本为5.4之后) 在VTK8.2以前的版本&#xff1a;QVT…

Springboot——集成jodconverter做文档转换

文章目录 前言jodconverter 简介下载安装 libreoffice代码演示1、创建springboot项目工程并引入依赖2、配置3、准备一个docx模板4、编写测试代码 运行后的样式linux 环境下安装 libreoffice 前言 公司项目开发中&#xff0c;早期使用docx4j进行word转pdf&#xff0c;出现了很多…

网络安全工程师最详细学习和职业规划路线(书籍推荐和导图下载)

网络安全行业热火朝天&#xff0c;但我们很少看到这个领域相关职业路线的规划&#xff0c;这一方面是由于这个行业还比较年轻&#xff0c;还没有完全建立职业路径&#xff0c;另一方面也是因为高端职位以前比较少&#xff0c;很少有人到达顶峰&#xff0c;所以难以总结。 但随…

计算机毕业设计 it职业生涯规划系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

动手学强化学习第2章多臂老虎机

2.1简介 多臂老虎机问题可以被看作简化版的强化学习问题。但是其只有动作和奖励没有状态信息&#xff0c;算是简化版的强化学习问题。 2.2问题介绍 2.2.1问题定义 在多臂老虎机(MAB)问题中&#xff0c;有一个有K根拉杆的老虎机&#xff0c;拉动每一根拉杆都对应一个关于奖励…

在 centos7 上安装Docker

1、检查linux内核 Docker 运行在 CentOS 7 上&#xff0c;要求系统为64位、系统内核版本为 3.10 以上。 Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上&#xff0c;要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。 uname -r 2、使用 root 权限登录 Centos…

docker应用记录总结

一、前言 docker这类部署工具&#xff0c;久而久之不使用非常容易忘记&#xff0c;甚至连操作命令都容易忘记。网上也有比较全的docker使用教程。这里做一个记录总结&#xff0c;纯属是温故知新。 二、docker部署应用 1、docker印象 docker首先让我想到的是是虚拟化技术&…

踩雷react-useRef钩子函数

今天测试提了一个bug&#xff0c;之前做的有个需求&#xff0c;在触发事件发起请求后&#xff0c;成功响应返回的新的数据没有第一时间渲染到网页上。 方法也都成功更新了数据&#xff0c;就是渲染会慢1-2分钟&#xff0c;排错排了老半天&#xff0c;最后找到了原因。 一般情…

SpringBoot和Hibernate——如何提高数据库性能

摘要&#xff1a;本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在软件开发领域&#xff0c;性能是重中之重。无论您是构建小型 Web 应用程序还是大型企业系统…

单目标应用:遗传算法(Genetic Algorithm,GA)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、遗传算法GA 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;起源于对生物系统所进行的计算机模拟研究&#xff0c;是一种随机全局搜索…

【Java 进阶篇】JavaScript 数据类型详解

JavaScript是一种弱类型脚本语言&#xff0c;具有动态类型。这意味着JavaScript中的变量可以容纳不同类型的数据&#xff0c;并且它们的类型可以在运行时更改。在本文中&#xff0c;我们将深入探讨JavaScript中的数据类型&#xff0c;包括原始数据类型和引用数据类型&#xff0…