3.1 命名空集using声明

news2025/1/20 6:02:23


 博主介绍:爱打游戏的计算机专业学生

博主主页:夏驰和徐策

所属专栏:夏驰和徐策带你从零开始学C++


前言:

第2章介绍的内置类型是由C++语言直接定义的。这些类型,比如数字和字符,体现了大 多数计算机硬件本身具备的能力。标准库定义了另外一组具有更高级性质的类型,它们尚 未直接实现到计算机硬件中。
本章将介绍两种最重要的标准库类型:string和vector。string表示可变长的 字符序列,vector存放的是某种给定类型对象的可变长序列。本章还将介绍内置数组类 型,和其他内置类型一样,数组的实现与硬件密切相关。因此相较于标准库类型string 和vector,数组在灵活性上稍显不足。
在开始介绍标准库类型之前,先来学习一种访问库中名字的简单方法。

我的理解:

这段话可以分为几个关键部分,我会为你逐一解析:

1. **内置类型与计算机硬件**
    - 这段话提到第2章介绍的是C++语言中的内置类型。这些类型,如数字和字符,反映了大多数计算机硬件直接支持的能力。换句话说,内置类型是C++为了直接与计算机硬件交互所定义的,这些类型可以直接映射到计算机硬件的特性。

2. **标准库类型**
    - 标准库定义了更高级的数据类型。这些类型并没有直接在计算机硬件中实现,而是通过软件逻辑来实现的。
    - 本章将重点介绍两个标准库类型:`string`和`vector`。
        - `string`:表示一个可变长的字符序列。它不同于C语言中的字符数组,因为它的长度可以在运行时改变。
        - `vector`:这是一个动态数组,可以存放任何给定的数据类型,其大小可以在运行时改变。

3. **内置数组与其局限性**
    - 除了介绍标准库类型,本章还会讨论内置数组类型。内置数组的实现与硬件密切相关,所以它的功能与标准库的`string`和`vector`相比较不够灵活。例如,内置数组的大小在定义时就固定了,而且不能在运行时更改。

4. **开始学习之前的预告**
    - 在深入学习标准库类型之前,章节还将为读者介绍如何简便地访问库中的名字。这可能预示了对命名空间或其他相关内容的讨论。

总结:这段话为读者提供了一个框架,让他们了解即将学习的内容。它对C++的内置类型和标准库类型进行了对比,并为读者强调了为什么需要学习标准库类型,特别是`string`和`vector`。

 3.1 命名空集using的声明

目前为止,我们用到的库函数基本上都属于命名空间std,而程序也显式地将这一点标示了出来。例如,std::cin表示从标准输入中读取内容。此处使用作用域操作符(::)(参见1.2节,第7页)的含义是:编译器应从操作符左侧名字所示的作用域中寻找右侧那个名字。因此,std::cin的意思就是要使用命名空间std中的名字cin。上面的方法显得比较烦琐,然而幸运的是,通过更简单的途径也能使用到命名空间中的成员。本节将学习其中一种最安全的方法,也就是使用using声明(usingdeclaration),18.2.2节(第702页)会介绍另一种方法。有了using声明就无须专门的前缀(形如命名空间::)也能使用所需的名字了。 using声明具有如下的形式:using namespace::name;
一旦声明了上述语句,就可以直接访问命名空间中的名字:

我的理解:

这段文字介绍了C++中关于命名空间的一部分知识,具体来说有以下几点:

1. **命名空间std**:
    - 你所使用的库函数大部分都属于命名空间std。这个命名空间基本上包含了C++标准库的所有内容。为了在代码中使用标准库中的特定元素(例如对象、函数等),你需要指定其命名空间,确保你在访问正确的名字。
    
2. **作用域操作符(::)**:
    - 使用`::`操作符,你可以从特定的命名空间中提取其元素。例如,`std::cin`表示你要使用命名空间std中的`cin`对象。

3. **using声明**:
    - 每次都写完整的`std::cin`或者`std::cout`显然有点繁琐。因此,C++提供了一个方法,允许你在代码的某一部分中直接访问特定命名空间中的某些名字,而不需要每次都添加命名空间前缀。
    - 这种方法就是使用`using`声明。声明的形式为:`using namespace::name;`。例如,`using std::cin;` 之后,在该作用域内,你就可以直接使用`cin`而不需要`std::`前缀。
    
4. **命名空间的其他方法**:
    - 文字中还提到了将在后续章节中介绍另一种方法。这暗示着命名空间的使用有多种方式,而`using`声明只是其中之一。

总结:这段话主要介绍了如何在C++代码中简化命名空间的使用,以便更方便地访问其成员。这可以通过使用`using`声明来实现,从而避免在每次访问命名空间的成员时都输入完整的前缀。

#include <iostream>
using std::cin;
int main(){
	int i;
	cin >> i;//正确:cin和std::cin含有相同
	cout << i;//错误:没有对应的using声明,必须使用完整的名字
	std::cout << i;//正确:显示地从std中使用cout
	return 0;
}

1.每个名字都需要独立的using声明

按照规定,每个using声明引入命名空间中的一个成员。例如,可以把要用到的标准库中的名字都以using声明的形式表示出来,重写1.2节(第5页)的程序如下:
#include <iostream>
using std::cin;
using std::cout; using std::endl;
int main(){
	cout << "Enter two numbers:" << endl;
	int v1, v2;
	cin >> v1 >> v2;
	cout << "The sum of" << v1 << "and" << v2 << "is" << v1 + v2 << endl;
	return 0;
}

对c i n c o u t e n d l us i ng 我们不
添加std::形式的前缀就能直接使用它们。C++语言的形式比较自由,因此既可以一行只
放一条using声明语句,也 可以一行放上多 条。不过要注 意,用到的每个名字都必须有
自己的声明语句,而且每句话都得以分号结束。

我的理解:

这段文本进一步说明了`using`声明的用途以及如何在实际的程序中应用它。让我们深入探讨它的内容:

1. **每个using声明引入一个名字**:
   - 使用`using`声明,可以将命名空间中的一个成员引入到当前作用域中。这意味着每个`using`声明只能引入一个名字。如果你想在代码中使用多个来自同一命名空间的名字,需要为每个名字都写一个`using`声明。

2. **代码示例**:
    - 在给出的代码示例中,作者展示了如何使用`using`声明来简化对`cin`、`cout`和`endl`的访问。因为使用了这些声明,所以在`main`函数中,程序可以直接使用`cin`、`cout`和`endl`,而不需要加上`std::`前缀。
    
3. **C++的语法自由性**:
    - C++允许你在一行中写多个语句,只要它们之间用分号隔开。在提供的代码示例中,作者在同一行上放置了两个`using`声明:`using std::cout; using std::endl;`。这展示了C++的语法灵活性。
    
4. **注意事项**:
    - 尽管C++在语法上很灵活,但你还是要确保每个`using`声明都以分号结尾,并且每个要使用的名字都需要有自己的声明语句。

总之,这段文本通过一个简单的示例展示了如何使用`using`声明来简化代码和增强可读性。

2.头文件不应包含using声明

位于头文件的代码(参见2.6.3节,第67页)一般来说不应该使用using声明。这
是因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,
那么每个使用了该头文件的文件就都会有这个声明。对于某些程序来说,由于不经意间包
含了一些名字,反而可能产生始料未及的名字冲突。

一点注意事项

经本节所述,后面的所有例子将假设,但凡用到的标准库中的名字都已经使用using
语句声明过了。例如,我们将在代码中直接使用cin,而不再使用std::cin。

了让书中的代码尽,今所有using声明#include指令
附录A中的表A.1(766)所有标准库中的名应的
头文件。

warning!

读者请注意:在编译及运行本书的示例前请为代码添加必要的#include指令和using声明。

我的理解:

这段话介绍了关于C++编程中头文件与`using`声明的建议和注意事项。以下是主要的信息点:

1. **头文件不应包含using声明**:
   - 使用`using`声明在头文件中是不建议的,因为头文件通常会被多个源文件包含。如果头文件中有`using`声明,那么所有包含该头文件的源文件都会有这个声明。这可能会导致意外的名字冲突,因为某些源文件可能并不想要或不知道这个`using`声明。

2. **示例的简化**:
   - 为了保持示例的简洁性,后续的例子将假设标准库中的所有名字都已经通过`using`语句声明过了。这意味着示例代码将直接使用`cin`而不是`std::cin`。
   
3. **省略using声明和#include指令**:
   - 为了进一步简化示例,书中不再明确地列出每个`using`声明或`#include`指令。但是,为了帮助读者,附录中提供了一个表格,列出了书中提及的所有标准库名字及其对应的头文件。
   
4. **警告**:
   - 读者需要特别注意,当尝试编译和运行书中的示例时,必须为代码添加必要的`#include`指令和`using`声明。这是因为书中为了简洁而省略了这些,但在实际编程中,它们是必须的。

综上所述,这段文字强调了在编写C++代码时,尤其是涉及头文件和`using`声明时的一些建议和最佳实践。并提醒读者,在使用书中的示例时,要确保正确地添加必要的指令和声明。

 总结:

**C++中命名空间的`using`声明的重点、难点和易错点**:

### 重点:

1. **目的**:`using`声明的主要目的是为了简化代码和增加可读性,允许你在不添加命名空间前缀的情况下使用命名空间中的特定成员。
   
2. **声明格式**:`using`声明的基本格式为`using namespace::name;`。例如,为了使用`std`命名空间中的`cin`,可以声明`using std::cin;`。

3. **与`using`指令的区别**:不要将`using`声明与`using`指令混淆。`using`指令(例如:`using namespace std;`)会导入整个命名空间的所有名字,而`using`声明只导入指定的名字。

### 难点:

1. **头文件中的使用**:在头文件中使用`using`声明可能会导致意外的名字冲突,因为头文件可能被多个源文件包含。

2. **多命名空间的管理**:当使用多个命名空间时,可能存在同名的成员,`using`声明可能导致不清楚引用的是哪个命名空间的成员,从而造成混淆。

### 易错点:

1. **滥用`using`指令**:而不是`using`声明。当不需要整个命名空间的所有名字时,不建议使用`using namespace`指令。这可能导致意外的名字冲突和编译错误。

2. **头文件中的`using`声明**:如前所述,不建议在头文件中使用`using`声明,因为这可能导致意外的名字冲突。

3. **忘记`using`声明**:当尝试使用命名空间的特定成员而没有进行适当的`using`声明或忘记命名空间前缀时,可能会导致编译错误。

4. **不清楚来源**:过多或不适当的使用`using`声明可能会使其他读者或开发者在阅读代码时不清楚某个名字的来源。

总之,`using`声明在C++中是一个非常有用的工具,可以简化代码并提高可读性。然而,它也需要谨慎使用,以避免潜在的问题和混淆。

 

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

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

相关文章

Python弹球小游戏

给在校的小妹妹做个游戏玩&#xff1a;. 弹珠游戏主要是靠坐标xy&#xff0c;接板长度&#xff0c;球的半径等决定&#xff1a; # -*- coding: utf-8 -*- # Author : Codeooo # Time : 2022/04/29import sys import time import random import pygame as pgprint("&q…

TCP三次握手,四次挥手,SYN泛洪攻击

目录 一.三次握手 二.SYN泛洪攻击概念 三.四次挥手 一.三次握手 当客户端调用connect连接服务器时,底层会发生“三次握手”&#xff0c;握手成功&#xff0c;建立连接,connect解阻塞&#xff0c;继续执行。 TCP报头&#xff1a; 三次握手过程&#xff1a; 客户端发出SYN请求…

P16 电路定理——巧妙-灵性-智慧

1、诺顿定理的证明 诺顿定理的证明&#xff0c; 回忆戴维南定理的证明是&#xff0c;在a,b两端加上一个电流源&#xff0c;再根据叠加定理&#xff0c;就解电压Uab。 对偶原理&#xff1a; 在a,b两端加上一个电压源u&#xff0c;再根据叠加定理求A中的独立源作用是给到a&#x…

下一代计算:嵌入AI的云/雾/边缘/量子计算

计算系统在过去几十年中推动了计算机科学的发展&#xff0c;现在已成为企业世界的核心&#xff0c;提供基于云计算、雾计算、边缘计算、无服务器计算和量子计算的服务。现代计算系统解决了现实世界中许多需要低延迟和低响应时间的问题。这有助于全球各地的青年才俊创办初创企业…

【学会动态规划】环形子数组的最大和(20)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

用友时空KSOA SQL注入漏洞[2023-HW]

用友时空KSOA SQL注入漏洞 一、 产品简介二、 漏洞分析三、 影响范围四、 复现环境五、 漏洞复现小龙POC检测脚本:批量SQL注入源码 六、 修复建议**临时缓解方案**升级修复方案 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供…

vue3+vite+pinia

目录 一、项目准备 1.1、Vite搭建项目 1.2、vue_cli创建项目 二、组合式API(基于setup) 2.1、ref 2.2、reactive 2.3、toRefs 2.4、watch和watchEffect 2.5、computed 2.6、生命周期钩子函数 2.7、setup(子组件)的第一个参数-props 2.8、setup(子组件)的第二个参数…

springboot父服务下创建子服务,依赖管理

在微服务中&#xff0c;我们会有一个父服务&#xff0c;下面建多个子服务。 1、创建子服务 2、子服务依赖父服务 引入父工程 3、父工程管理子服务 4、查看依赖正常 结束&#xff01;&#xff01; hy:25 知识是对灵魂的澄清。 -- 柏拉图《理想国》

29 深度玻尔兹曼机

文章目录 29 深度玻尔兹曼机29.1 背景介绍29.2 DBM的叠加方式 29 深度玻尔兹曼机 29.1 背景介绍 过去在解决BM问题的时候&#xff0c;提出过多种模型&#xff1a;RBM、SBN、DBN 其中RBM是一种有限制条件的&#xff0c;简化的BM&#xff0c;限制了隐藏层和观测层内部都没有连…

GEE学习05

修改输出绝对路径 和python里面一样&#xff0c;修改输出底图的路劲&#xff1a; Map3.save(r"C:\test\topo.html")1、浏览一下GEE帮助文档 https://developers.google.cn/earth-engine/guides 这个链接是国内外都可以正常访问的。 GEE指导主要是针对的JS&#xf…

Verdi_Annotate Macro功能

Verdi_Annotate Macro功能 介绍 When debugging designs that contain define macros, it is often helpfull to view a macro definition in the context of a macro reference. 在调试包含定义宏的设计时&#xff0c;在宏引用上下文中查看宏定义通常会很有帮助。 方法 Sh…

PDM/PLM系统建设

仅供学习使用&#xff0c;会随时更新 工程机械跨生命周期数据管理系统 来源&#xff1a;清华大学 浅论企业PDM/PLM系统建设成功经验 来源&#xff1a;e-works 作者&#xff1a;陈凡 https://articles.e-works.net.cn/pdm/article149572.htm 随着“中国制造2025”强基工程战略的…

髋关节 弹响

评估测试 https://www.bilibili.com/video/BV1A44y1j71Y/?spm_id_from333.880.my_history.page.click&vd_source3535bfaa5db8443d107998d15e88dc44 根据此视频整理所得 托马斯测试 第一种情况 如果你难于将膝关节拉到胸前&#xff0c;并感觉前面有骨性的挤压 说明你股…

六、Linux系统下,文件操作命令都有哪些?

总括&#xff1a; 创建文件/文件夹&#xff1a;touch&#xff1b; 查看&#xff1a;cat/more&#xff1b; 复制&#xff1a;copy&#xff1b; 移动文件/文件夹&#xff1a;mv&#xff1b; 删除&#xff1a;rm&#xff1b; 1、创建文件 &#xff08;1&#xff09;语法&#x…

VS2015项目中,MFC内存中调用DLL函数(VC6生成的示例DLL)

本例主要讲一下&#xff0c;用VC6如何生成DLL&#xff0c;用工具WinHex取得DLL全部内容&#xff0c;VC2015项目加载内存中的DLL函数&#xff0c;并调用函数的示例。 本例中的示例代码下载&#xff0c;点击可以下载 一、VC6.0生成示例DLL项目 1.新建项目&#xff0c;…

PAT 1079 Total Sales of Supply Chain

个人学习记录&#xff0c;代码难免不尽人意。 A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier…

sleep以及如何正确终止线程

Thread.sleep()为什么要抛出中断异常或者放入try-catch中&#xff1f; 因为&#xff1a;在 sleep 的同时也要对外界情况有感知能力&#xff0c;也就是能够响应中断。比如在调用 interrupt() 的时候&#xff0c;其实就是想尽快地结束线程&#xff0c;所以&#xff0c;继续的 sl…

结构体指针变量的使用

1、结构体指针的引用 #include<iostream> using namespace std;struct Student {int num;char name[32]; }; int main() {struct Student stu {1,"张三"};struct Student* p &stu;system("pause"); return 0; } 2、通过结构体指针访问结构体…

使用Scanner接收用户输入

扫描输入的两种方式 Scanner主要提供了两个方法来扫描输入&#xff1a; &#xff08;1&#xff09;hasNextXxx()&#xff1a;是否还有下一个输入项&#xff0c;Xxx可以是Int&#xff0c;Long等代表基本数据类型的字符串。 如果只是判断是否包含下一个字符串&#xff0c;则直…

Spring Boot(六十四):SpringBoot集成Gzip压缩数据

1 实现思路 2 实现 2.1 创建springboot项目 2.2 编写一个接口,功能很简单就是传入一个Json对象并返回 package com.example.demo.controller;import com.example.demo.entity.Advertising; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springf…