C++:命名空间与输入输出

目录

前言

一、命名空间

1.1 namespace的价值

1.2 namespace的定义

1.3 命名空间的使用

二、C++输入&输出


前言

    C++是一种面向对象的计算机程序设计语言,‌它扩展了C语言的功能,‌并引入了面向对象编程的概念,‌如类、‌继承和多态等,C++是以C语言为基础进行了拓展与创新,C++兼容C语言绝大多数的语法。

    还记得我们在学C语言时的第一个代码程序吗?

#include<stdio.h>
int main()
{printf("hello world\n");return 0;
}

    C++也兼容这种写法,但是C++有⼀套自己的输入输出,严格说C++版本的hello world应该是这样写的。

#include<iostream>
using namespace std;
int main()
{cout << "hello world\n" << endl;return 0;
}

    现在还不认识不要紧,本篇会讲解C++的一些基础知识, 看完后就明白是怎么一回事了。

一、命名空间

1.1 namespace的价值

    c语言项目类似下面程序这样的命名冲突是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题。

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

    这里我们可以看到编译器报错了,因为在stdlib头文件中包含一个名为rand的函数与定义的变量rand发生了命名冲突。在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突名字污染,namespace关键字的出现就是针对这种问题的。 

1.2 namespace的定义

• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员,命名空间中可以定义变量/函数/类型等。

• namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不再冲突了。

#include <stdio.h>
#include <stdlib.h> 
// otto是命名空间的名字 
namespace otto
{// 命名空间中可以定义变量/函数/类型 int rand = 10;//变量int Add(int left, int right)//函数{return left + right;}class otto//类{public:void man(){return;}private:int x;};}
int main()
{printf("%p\n", rand);printf("%d\n", otto::rand);return 0;
}

     第一个printf默认访问的是全局的rand函数地址,第二个printf用到的是otto命名空间里的rand,这样就解决了命名冲突的问题。

• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型声明或定义的逻辑,所有有了域隔离,命名冲突就解决了,局部域和全局域除了会影响 编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。 

• namespace只能定义在全局,当然他还可以嵌套定义。

namespace otto
{namespace kun{int rand = 1;int Add(int left, int right){return left + right;}} 
}
int main()
{printf("%d\n", otto::kun::rand);printf("%d\n", otto::kun::Add(1, 2));return 0;
}

• 项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。

• C++标准库都放在⼀个叫std(standard)的命名空间中。

1.3 命名空间的使用

    编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找,所以下面程序会编译报错,

namespace N
{int a = 0;int b = 1;
}
int main()
{printf("%d\n", a);return 0;
}

所以我们要使用命名空间中定义的变量/函数,有三种方式:

• 指定命名空间访问,项目中推荐这种方式。

int main()
{printf("%d\n", N::a);return 0; 
}

    通过“命名空间+::”的方式在指定命名空间访问。

• using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。

using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0; 
}

    展开后使用这个变量时就不用带命名空间了。 

• 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。 

using namespce N;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0; 
}

二、C++输入&输出

 • <iostream>是Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输 出对象。

std::cin是 istream 类的对象,它主要面向窄字符的标准输入流。

std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。

std::endl 是⼀个函数,流插入输出时,相当于插入⼀个换行字符加刷新缓冲区。

• <<是流插入运算符,>>是流提取运算符。

• 使⽤C++输⼊输出更方便,不需要像printf/scanf输⼊输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型,其实最重要的是 C++的流能更好的支持自定义类型对象的输入输出。

• IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这里我们只能简单认识⼀下C++ IO流的用法,后面会有专门的⼀个章节来细节IO流库。

cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使用方式去用他们。

• ⼀般日常练习中我们可以using namespace std,实际项目开发中不建议使用

• 这里我们没有包含,也可以使用printf和scanf,在包含间接包含了。vs系列编译器是这样的,其他编译器可能会报错。

#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;
}


     本篇内容就先到这里了,希望对各位有帮助,喜欢不要忘记三连,蟹蟹。

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

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

相关文章

【图形学】TA之路-矩阵应用平移-旋转-大小

矩阵应用&#xff1a;在 Unity 中&#xff0c;Transform 和矩阵之间的关系非常密切。Transform 组件主要用于描述和控制一个物体在三维空间中的位置、旋转和缩放&#xff0c;而这些操作背后实际上都是通过矩阵来实现的 1. Transform 组件与矩阵的关系 Transform 组件包含以下…

基于django的影音播放网站 /基于python的影视网站/影视播放系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

论文阅读笔记:The Graph Neural Network Model

论文来源 IEEE Transactions on Neural Networks&#xff0c;Volume: 20 Issue: 1 背景 图神经网络模型本身具有广泛的使用背景&#xff0c;由于我个人研究交通流量预测的需要&#xff0c;此处仅考虑深度学习领域。图结构指的是由节点node和若干个连接的边edge组成的一种数据…

Spring Boot 3.3 【四】Spring Boot 整合JPA

&#x1f31f; 技术人聊管理 请关注 【技术管理修行】 一、JPA 简介 Spring Data JPA 是 Spring Data 项目的一部分&#xff0c;它为使用 Java Persistence API (JPA) 进行数据库访问提供了一种非常简便的方式。Spring Data JPA 的主要目的是简化基于 JPA 的数据访问层的开发工…

XSS-过滤特殊符号的正则绕过

目录 靶场练习地址&#xff1a;https://xss.pwnfunction.com/ 题目源码&#xff1a; 代码分析&#xff1a; 方法一&#xff1a;匿名函数 方法二&#xff1a;使用eval函数绕过限制 示例&#xff1a; 方法三&#xff1a;利用hash绕过 靶场练习地址&#xff1a;https://xs…

【Linux网络】NAT技术

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 随着互联网的飞速发展&#xff0c;IP地址资源日益紧张&#xff0c;这促使了NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术的诞生与发展。NAT技术不仅解决了IPv4…

MySQL实现SQL Server中UPDLOCK与READPAST组合功能

碰到一位同事求助解决消息中台一个线上的bug&#xff0c;具体描述如下&#xff1a; 首先有一张主表记录消息待发送的内容&#xff0c;一张子表记录本条消息的发送状态。若发送成功则将此条消息的发送状态修改为已发送并做逻辑删除。代码通过定时任务每2s轮询子表&#xff0c;如…

安装cuda支持的opencv-python Windows版本(包含常见错误处理)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

节点使用简介:comfyui-photoshop

1、安装comfyui-photoshop 略过 一点要注意的是&#xff1a;在Photoshop上的安装增效工具&#xff0c;要通过Creative Cloud 桌面应用程序进行安装&#xff0c;才能成功在增效工具中显示&#xff0c;直接通过将文件解压到Plug-ins路径行不通&#xff08;至少对我来说行不通&am…

C++语言基础|函数的嵌套与递归

C语言基础|函数的嵌套与递归 1. 函数的嵌套调用2. 函数的递归调用 1. 函数的嵌套调用 在一个函数中调用其它函数叫函数的嵌套。C中函数的定义是平行的&#xff0c;除了main()以外&#xff0c;都可以互相调用。函数不可以嵌套定义&#xff0c;但可以嵌套调用。比如函数1调用了函…

【百度】25届秋招内推码

内推码 IV1RBB 介绍 &#x1f4e3; 百度TPG技术中台事业群组—深度学习技术平台部 25届校招正在进行中&#xff0c;可通过定向内推形式get校招绿色通道 &#xff01; 欢迎联系我定向内推 &#x1f31f;【部门介绍】 飞桨&#xff08;PaddlePaddle&#xff09;以百度多年的深度…

前端技巧——复杂表格在html当中的实现

应用场景 有时候我们的表格比较复杂&#xff0c;表头可能到处割裂&#xff0c;我们还需要写代码去完成这个样式&#xff0c;所以学会在原生html处理复杂的表格还是比较重要的。 下面我们来看这一张图&#xff1a; 我们可以看到有些表头项的规格不太一样&#xff0c;有1*1 2*…

阶段练习——minishell

目录 &#xff08;一&#xff09;文件复制&#xff08;my_cp函数&#xff09; &#xff08;二&#xff09;文件内容查看&#xff08;my_cat函数&#xff09; &#xff08;三&#xff09;切换目录&#xff08;my_cd函数&#xff09; &#xff08;四&#xff09;列出目录内容…

Elasticsearch、Easy-es 快速入门 SearchAfterPage分页 若依前后端分离 Ruoyi-Vue SpringBoot

一、环境安装 Elasticsearch ik分词器 1.1 下载解压Elasticsearch-7.x版本&#xff0c;越高越好&#xff0c;低版本有Log4j漏洞&#xff0c;Easy-es目前支持7.x 1.2 IK中文分词器 将对应Elasticsearch版本IK放进文件夹&#xff0c;Elasticsearch-7.6.1&#xff0c;ik对应版…

Postgres 超时 (Timeout) 详解

原文地址 https://www.bytebase.com/blog/postgres-timeout/ PostgreSQL 提供各种超时 (Timeout) 设置&#xff0c;通过控制某些进程的持续时间来帮助管理和优化数据库操作。这些超时对于确保系统的稳定性和性能至关重要&#xff0c;尤其是在高流量或复杂查询的环境中。让我们…

STM32CubeMX生成stm32MP135中断优先级配置错误修正方法

0 修改方法 使用STM32CubeMX生成stm32MP135代码的中断优先级配置错误&#xff0c;将导致所有中断优先级设置不对。 如果设置EXTI0中断优先级为10&#xff0c;在STM32CubeMX中配置如下&#xff1a; 生成的中断优先级配置代码为&#xff1a; 正确写法应该将中断优先级左移3位&…

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

二叉树学习笔记

一、树的概念 树是一种非线性的结构&#xff0c;它是由n个有限结点组成的一个具层次关系的集合。&#xff08;像一颗倒着的树&#xff09; 特点&#xff1a; 有一个特殊的结点&#xff0c;称之为根结点&#xff0c;根结点没有前驱结点 除了根节点以外&#xff0c;其余节点别分…

centos 7.9 迁移到 openEuler22.03-LTS-SP3

openEuler移植案例 | 移植操作指南 | openEuler社区官网 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要两台机器&#xff0c; 不通过原因 在待升级节点检查是否有安装x2openEuler-core时, 发现已经安装了,不能作为升级节点。该节点为&#xff1a; 解…

MySQL中处理JSON数据

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 在大数据时代&#xff0c;处理和分析结构化与非结构化数据的能力对于企业的成功至关重要。MySQL作为一种广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;在应对传统结构化数据方面表现出色。然…