3.1 命名空集using声明

本文介绍了C++中的内置类型,如数字和字符,以及标准库类型string和vector。强调了标准库类型在灵活性上的优势,并讲解了如何通过using声明简化访问命名空间中的成员。同时,指出了在头文件中使用using声明的潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

博主主页:夏驰和徐策

所属专栏:夏驰和徐策带你从零开始学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++中是一个非常有用的工具,可以简化代码并提高可读性。然而,它也需要谨慎使用,以避免潜在的问题和混淆。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值