【C++】C++入门 命名空间 及输入与输出

news2024/11/24 6:16:22

前言

C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助。

  • C++补充C语言语法的不足,以及对C语言设计不合理的地方进行优化,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。

命名空间

  • 一、C++关键字(C++98)
  • 二、命名空间
    • 1.命名空间的背景
    • 2.命名空间的定义
    • 3.命名空间使用
  • 三、C++输入与输出
    • 1.标准命名空间std
    • 2.标准输出cout
    • 3.标准输入cin


一、C++关键字(C++98)

C语言有32个关键字,而C++总计有63个关键字!
下面我们只是了解一下C++的关键字,暂时不对关键字进行具体的讲解。

  • C语言
    在这里插入图片描述
  • C++
    在这里插入图片描述

二、命名空间

1.命名空间的背景

对于命名空间的理解,我们先看一个bug,明白了它你就知道为什么要有命名空间了!

#include <stdio.h>
#include <stdlib.h>
int rand = 10;

int main()
{
printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

我们知道rand是C语言的一个随机函数,就在#include <stdlib.h>库中,而我们却定义rand是一个变量 ,于是发生了命名冲突,程序无法运行,这个时候我们就需要用命名空间将它们区分开来。

当C++工程较大时,程序内存在大量的变量、函数和类,如果这些变量、函数和类都存在于同一个作用域中,一不小心就可能会导致命名冲突。为了解决这个问题,C++引入了命名空间(namespace)这个概念,这样在不同的命名空间中允许存在同名的标识符。有了命名空间我们就可以在程序中有效地避免命名冲突。

2.命名空间的定义

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

  1. 命名空间中可以定义变量,函数,类型
namespace test_1
{
	int rand = 10;

	int Add(int x, int y)
	{
		return x + y;
	}

	struct Node
	{
		struct Node* next;
		int data;
	};
}
  1. 命名空间可以嵌套
namespace test_2
{
	int a;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace test_3
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}
  1. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
namespace test_2
{
int Mul(int left, int right)
{
return left * right;
}
}

ps:一个工程中的 test_2 和上面的 test_2 中两个 test_2 会被合并成一个

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

3.命名空间使用

  • 引例
    命名空间中成员该如何使用呢? 我们先看一个例子,我们知道在C语言中局部变量优先,第六行应该打印20,但是我们就想打印全局变量怎么办呢?这个时候我们只需要在 a 前加域作用符(::)就行了,由于域作用符(::)左边是空的,所以代表是全局域,这样我们第7行就可以打印全局变量了。
#include <stdio.h>
int a = 10;
int main()
{
	int a = 20;
	printf("%d\n", a);
	printf("%d\n", ::a);
	return 0;
}

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

命名空间的使用三种方式:
假设下面三种方式的代码的前面都有一段如下的代码

namespace test_2
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace test_3
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}
  1. 加命名空间名称及作用域限定符
int main()
{
	//printf("%d\n", a);    //编译报错:error C2065 : “a”: 未声明的标识符
	printf("%d\n", test_2::a);
	return 0;
}
  1. 使用using将命名空间中某个成员引入
using test_2::b;
int main()
{
	printf("%d\n", test_2::a);
	printf("%d\n", b);
	return 0;
}
  1. 使用using namespace 命名空间名称 引入
using namespce test_2;
int main()
{
	printf("%d\n", test_2::a);//可以不加test_2::
	printf("%d\n", b);
	Add(10, 20);
	return 0;
}

三、C++输入与输出

C++的标准输入与输出函数是cin cout,在使用它们之前我们要先了解标准命名空间(std)

1.标准命名空间std

命名空间的定义可以是不连续的,标准命名空间std也不例外,std的定义被分散在多个头文件里,比如标准输入/输出头文件< iostream> 中就定义了一个标准命名空间< iostream>里面的函数或类被放在std命名空间中,比如cin和cout这两个函数的名字就放在命名空间std里面,如果我们想使用cout函数,那就必须使用std命名空间引入这个函数。

2.标准输出cout

#include<iostream>
using namespace std;
int main()
{
	cout << "Hello world!!!" << endl;//endl是C++换行符(\n)
	return 0;
}

在这里插入图片描述

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型。
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识。

3.标准输入cin

#include <iostream>
using namespace std;
int main()
{
	int a;
	double b;
	char c;
	// 可以自动识别变量的类型
	cin >> a;
	cin >> b >> c;
	cout << a << endl;
	cout << b << " " << c << endl;
	return 0;
}

在这里插入图片描述

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用< iostream>+std的方式。

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

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

相关文章

联想昭阳K4e电脑系统错误导致屏幕闪烁怎么重装系统?

联想昭阳K4e电脑系统错误导致屏幕闪烁怎么重装系统&#xff1f;有用户安装的电脑系统有兼容性错误&#xff0c;导致电脑开机之后&#xff0c;屏幕会不断的进行闪烁&#xff0c;无法正常的进行电脑操作。那么这个情况我们如何去进行电脑系统的重装呢&#xff1f;今天教大家U盘重…

项目管理系统

项目要求 1&#xff09;服务器负责管理所有员工表单&#xff08;以数据库形式&#xff09;&#xff0c;其他客户端可通过网络连接服务器来查询员工表单。 2&#xff09;需要账号密码登陆&#xff0c;其中需要区分管理员账号还是普通用户账号。 3&#xff09;管理员账号可以查…

【数据结构】极致详解:树与二叉树(下)——链式存储实现

目录 &#x1f929;前言&#x1f929;&#xff1a; &#x1f92f;一、链式存储概述&#x1f92f;&#xff1a; &#x1f920;二、链式结构的遍历&#x1f920;&#xff1a; 1.前序、中序与后序遍历&#xff1a; 2.层序遍历&#xff1a; &#x1f970;三、链式存储结构各接…

2023年转行IT互联网:盘点高薪职业岗位!

要问今年转行求职最想进入的行业&#xff0c;那么互联网肯定算其中一个。智联招聘发布的《2022大学生就业力调研报告》显示&#xff0c;IT/通信/电子/互联网行业是应届生最期望就业的行业。中国青年报中青校媒面向全国大学生发起调查&#xff0c;有64.33%希望毕业后能进入互联网…

linux常识及常用命令

一、介绍 一般项目都是部署在linux服务器上的&#xff0c;linux内核起初是由芬兰人林纳斯托瓦兹在上学时出于爱好编写的。它是一套免费试用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX&#xff08;可移植&#xff09;和UNIX的多用户、多任务、多线程和多CPU的操作…

Task10-Excel看板

文章目录一 分析思路二 实现过程1 确定周数2 销售基础整理3 周销售数据变化趋势4 周销售渠道整理5 看板绘制一 分析思路 二 实现过程 1 确定周数 确定日期所在的周数用&#xff1a;【WEEKNUM函数】 WEEKNUM&#xff08;serial_num&#xff0c;return_type&#xff09;参数Ser…

简介CSS

目录 一、CSS概述 二 、CSS的语法规则 三、CSS的引入方式 1、内部样式表 2、行内样式表 四、代码风格 1、紧凑风格 2、展开风格 五、选择器 1、基础选择器 标签选择器 类选择器 id选择器 通配符选择器 2、复合选择器 后代选择器 子选择器 并集选择器…

网络设备和常见网络拓扑

目录 集线器 网桥 交换机 路由器 常见网络拓扑 总线型 环形 星型 树型 网状 集线器 集线器的英文称为“Hub”。“Hub”是“中心”的意思&#xff0c;它的主要功能是对接收到的信号进行再生整形放大&#xff0c;以扩大网络的传输距离&#xff0c;同时把所有节点集中在…

threejs 几何图形 相交、差集、并集 插件

目前搜集到的有以下几个 THREE-CSGMeshhttps://github.com/manthrax/THREE-CSGMeshcsg.jshttps://github.com/jscad/csg.jsOctreeCSGhttps://github.com/giladdarshan/OctreeCSG/threeBSP 这个现在已经不更新了【对新版本不支持了geometry新版中移除了】threebsp 【这个是前辈…

Win10系统如何调整分区大小?

在使用Win10系统的过程中&#xff0c;如果电脑分区大小不合适或某个分区已满的问题可以通过调整分区大小来解决。可以缩小其他有闲置空余空间的分区&#xff0c;在得到未分配的空间后&#xff0c;然后将其分配到已满的分区&#xff0c;或者直接合并2个分区。接下来一起看看调整…

Elasticsearch Java入门

Elasticsearch安装 官网下载 下载的时候注意版本&#xff0c;spring boot如果用的是2.2版本就下载6.8的版本就行 下载完成之后解压&#xff0c;运行bin->elasticsearch.bat就可以启动服务了 做出win服务 elasticsearch-service.bat install浏览器输入localhost:9200 Ki…

BandZip cmd调用参数

命令行参数 Bandizip&#xff08;Bandizip.exe&#xff09;及其控制台应用程序&#xff08;bz.exe&#xff09;支持以下命令行参数&#xff1a; 注&#xff1a;推荐使用bz.exe&#xff0c;这个是专门给控制台的&#xff0c;更加稳定一些 # Bandizip.exe <archive> # Ban…

Linux中hosthost.confhost.allowhost.deny作用

可实现应急响应断网&#xff1a;阻止本机对恶意IP的访问链接 /etc/host.conf 为解析库声明的配置信息 /etc/hostname 配置主机名&#xff08;永久生效&#xff09; /etc/hosts 配置ip地址映射 /etc/hosts.allow 配置ip地址白名单 /etc/hosts.deny 配置ip地址黑名单 解…

Centos7安装jdk1.8tomcat

文章目录注意一 jdk1.8下载与安装1.1 JDK下载地址1.2 查看Centos7自带jdk版本1.2.1 第一种方式1.2.2 第二种方式1.2.3 第三种方式1.2.4 下载自带JDK1.2.5 安装JDK1.2.6 补充&#xff1a;查看jdk的安装目录1.2.7 配置环境变量二 tomcat下载与安装三 服务器运行项目模拟3.1 第一步…

EvilSelenium:一款功能强大的Chromium浏览器渗透测试工具

关于EvilSelenium EvilSelenium是一款基于 Selenium的渗透测试工具&#xff0c;该工具基于武器化的Selenium实现其功能&#xff0c;可以帮助广大研究人员针对基于Chromium的浏览器进行安全分析和渗透测试。 功能介绍 1、通过autofill获取存储的凭证信息&#xff1b; 2、获取C…

2023年黑马Java入门到精通教程--Java基础语法

java基础语法 变量详解 二进制 只有0、1&#xff0c;按照逢2进1的方式表示数据&#xff1a; 十进制转二进制的算法 除二取余法。 计算机中的数据的最小单位 其他数据形式是如何存储的 字符在计算机中是如何存储的呢&#xff1f; ASCII编码表&#xff1a;即美国信息交换标准…

代码随想录算法训练营第五十八天_第九章_动态规划 | 392.判断子序列、115.不同的子序列

LeetCode 392.判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 视频讲解https://www.bilibili.com/video/BV1tv4y1B7ym/?spm_id_from333.788&vd_sourcef98f2942b3c4cafea8907a325fc56a48文章讲解https://programmercarl.com/0392.%E5%88%A4%E6%96%A…

【Java线程】线程退出和终止

1. 线程终止 —— 通知方式 通过在 T1 线程中修改 T2 线程中的控制变量&#xff0c;来实现 T1 线程通知 T2 线程终止。 示例如下&#xff1a; /*** description: 线程的终止和退出测试* author: Liuwanqing* date: 2022-10-14 17:00*/ public class ThreadExit_ {public sta…

边缘检测与角点检测(模式识别与图像处理课程作业)

边缘检测与角点检测&#xff08;模式识别与图像处理课程作业&#xff09;一、边缘检测1.1、读取图像1.2、图像转换成灰度图像1.3、Sobel算子1.4、Canny算子1.5、显示正常中文的标签1.6、边缘检测结果二、角点检测2.1、读取图像2.2、图像转换成灰度图像2.3、Harris算子2.4、设置…

HTTPTunnel测试

介绍 HTTPTunnel是一个隧道软件。通过http的GET和POST请求隐藏隧道内的流量。适用于有网络封锁的环境&#xff0c;比如防火墙仅允许80端口数据包通过&#xff0c;内部终端访问外部其他应用时&#xff0c;或者渗透测试时访问内部目标服务器的其他业务端口时&#xff0c;都可以通…