C++从入门到实战(二)C++命名空间

news2025/3/1 1:33:32

C++从入门到实战(二)C++命名空间

  • 前言
  • 一、C++的第一个程序
  • 二、命名空间
    • (一)为什么需要命名空间
    • (二)定义命名空间
    • (三)使用命名空间
      • 1.通过命名空间限定符:
      • 2.使用 using 声明:
        • 2.1展开命名空间
        • 2.2使用 using namespace
    • (四)嵌套命名空间
    • (五)标准命名空间 std


前言

  • 上一节我们介绍了 C++ 的历史,对这门强大编程语言的发展脉络有了清晰认识。这一节我们将围绕着 C++ 的第一个程序,深入探讨 C++ 的命名空间。理解命名空间对于我们编写大型、复杂且结构清晰的 C++ 程序至关重要。

一、C++的第一个程序

  • 在 C++ 中,经典的第一个程序通常是 “Hello, World!” 程序。下面是该程序的代码示例:
#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

在这段代码中

#include <iostream> 是预处理指令,这个头文件提供了输入输出流的功能,比如 cout 用于输出。

std::cout << "Hello, World!" << std::endl; 这行代码用于在控制台输出 “Hello, World!”。

std::cout 是标准输出流对象,<< 是流插入运算符,

std::endl 用于换行并刷新缓冲区

二、命名空间

在这里插入图片描述

(一)为什么需要命名空间

  • 随着项目规模的扩大,代码中会定义大量的变量、函数和类等标识符。
  • 不同的库或者模块可能会使用相同的标识符名称,这就会导致命名冲突。
  • 例如,两个不同的库都定义了一个名为 print 的函数,如果同时使用这两个库,编译器就无法确定调用哪个 print 函数

命名空间就是为了解决这个问题而引入的。

  • 它可以将全局作用域划分为不同的逻辑区域,每个区域内的标识符相互独立,避免命名冲突。

(二)定义命名空间

  • 在 C++ 中,可以使用 namespace 关键字来定义命名空间。例如:
namespace MyNamespace {
    int value = 10;
    void print() {
        std::cout << "This is in MyNamespace. Value is: " << value << std::endl;
    }
}

在上述代码中,定义了一个名为 MyNamespace 的命名空间,在这个命名空间内定义了一个变量 value 和一个函数 print。

(三)使用命名空间

1.通过命名空间限定符:

  • 要使用命名空间内的成员,可以使用命名空间限定符 ::
#include <stdio.h>
#include <stdlib.h>
namespace bit
{
	int rand = 10;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}

int main()
{
	printf("%d\n", bit::rand);
}

2.使用 using 声明:

  • 可以使用 using 声明来引入命名空间中的特定成员。
  • 也可以展开命名空间
2.1展开命名空间
  • 如果将展开命名空间理解为让命名空间内所有成员都能像在全局作用域一样直接使用,那么using namespace语句更符合这一描述。
namespace MyNamespace {
    int value = 10;
    void print() {
        std::cout << "Value is: " << value << std::endl;
    }
}

using namespace MyNamespace;

int main() {
    print();
    std::cout << "Value: " << value << std::endl;
    return 0;
}

在这里,using namespace MyNamespace;使得MyNamespace中的所有成员(value和print函数)都可以直接在main函数中使用,就好像它们是在全局作用域中定义的一样。

2.2使用 using namespace
namespace MyNamespace {
    int value = 10;
    void print() {
        std::cout << "Value is: " << value << std::endl;
    }
}

using MyNamespace::print;

int main() {
    print();
    // std::cout << "Value: " << value << std::endl; 
    // 这行代码会报错,因为value未通过using声明引入
    return 0;
}

在这个例子中,using MyNamespace::print;仅引入了print函数,因此只能直接使用print函数,而不能直接使用MyNamespace中的value变量。这表明using声明并没有像展开命名空间那样让所有成员都能直接使用,而是精确地引入指定成员

在这里插入图片描述

(四)嵌套命名空间

  • 命名空间可以嵌套定义:
namespace OuterNamespace {
    namespace InnerNamespace {
        int nestedValue = 20;
        void nestedPrint() {
            std::cout << "This is in InnerNamespace. Nested value is: " << nestedValue << std::endl;
        }
    }
}
  • 使用嵌套命名空间内的成员时,需要使用多层命名空间限定符:
int main() {
    std::cout << "Nested value: " << OuterNamespace::InnerNamespace::nestedValue << std::endl;
    OuterNamespace::InnerNamespace::nestedPrint();
    return 0;
}

(五)标准命名空间 std

  • 在 C++ 中,std 是标准命名空间

  • 几乎所有的标准库函数和类型都定义在这个命名空间内,比如前面提到的 cout、endl 等。

  • 通常我们使用标准库时,会通过std::来限定,如 std::cout。

  • 也可以使用 using 声明或 using namespace std; 来简化使用

全局使用 using namespace std; 要谨慎。

全局使用 using namespace std; 要谨慎。

全局使用 using namespace std; 要谨慎。

  • 1. 命名冲突风险

C++ 标准库 std 包含大量的标识符,如类型(std::string、std::vector)、函数(std::cout、std::sort)和模板(std::map、std::unique_ptr)等。当在全局使用 using namespace std; 后,这些标识符都被引入到全局作用域。如果项目中也定义了与标准库同名的标识符,就会引发命名冲突。

  • 2. 可读性降低
  • 使用 using namespace std; 后,代码中直接使用标准库的标识符,无法直观地判断该标识符是来自标准库还是其他自定义命名空间。这对于阅读代码的人来说,尤其是对代码库不熟悉的人,增加了理解难度

相比之下,使用 std:: 前缀,如 std::vector numbers;,可以清晰地表明 vector 是标准库中的类型。


以上就是这篇博客的全部内容,下一篇我们将继续探索 C++ 的更多精彩内容。

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

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

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

相关文章

广西螺蛳粉:舌尖上的美食传奇

广西螺蛳粉:舌尖上的美食传奇 在广西壮族自治区,有一种小吃以其独特的酸辣鲜香和丰富的历史文化底蕴,成为了无数食客心中的美食传奇——这就是广西螺蛳粉。 一、历史渊源 螺蛳粉最早出现于20世纪70年代末的柳州市,是柳州人民对美食的创新与智慧的结晶。早在40多年前,大量的螺…

基于本地事务表+MQ实现分布式事务

基于本地事务表MQ实现分布式事务 引言1、原理2、本地消息表优缺点3、代码实现3.1、代码执行流程3.2、项目结构3.3、项目源码 引言 本地消息表的方案最初由ebay的工程师提出&#xff0c;核心思想是将分布式事务拆分成本地事务进行处理。本地消息表实现最终一致性。本文主要学习…

Java 大视界 -- Java 大数据中的知识图谱构建与应用(62)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

LVGL+FreeRTOS实战项目:智能健康助手(Max30102篇)

MAX30102 心率血氧模块简介 功能&#xff1a;用于检测心率和血氧饱和度&#xff0c;集成了红外和红光 LED 以及光电二极管。 接口&#xff1a;支持 I2C 通信&#xff0c;默认 I2C 地址为 0x57。 应用&#xff1a;广泛用于健康监测设备中&#xff0c;如智能手环、手表等。 硬…

计算机网络 (59)无线个人区域网WPAN

前言 无线个人区域网&#xff08;WPAN&#xff0c;Wireless Personal Area Network&#xff09;是一种以个人为中心&#xff0c;采用无线连接方式的个人局域网。 一、定义与特点 定义&#xff1a;WPAN是以个人为中心&#xff0c;实现活动半径小、业务类型丰富、面向特定群体的无…

【优选算法】9----长度最小的子数组

----------------------------------------begin-------------------------------------- 铁子们&#xff0c;前面的双指针算法篇就算告一段落啦~ 接下来是我们的滑动窗口篇&#xff0c;不过有一说一&#xff0c;算法题就跟数学题一样&#xff0c;只要掌握方法&#xff0c;多做…

第十四讲 JDBC数据库

1. 什么是JDBC JDBC&#xff08;Java Database Connectivity&#xff0c;Java数据库连接&#xff09;&#xff0c;它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库&#xff0c;并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作…

Java面试题2025-Mysql

1.什么是BufferPool&#xff1f; Buffer Pool基本概念 Buffer Pool&#xff1a;缓冲池&#xff0c;简称BP。其作用是用来缓存表数据与索引数据&#xff0c;减少磁盘IO操作&#xff0c;提升效率。 Buffer Pool由缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制…

Golang:使用DuckDB查询Parquet文件数据

本文介绍DuckDB查询Parquet文件的典型应用场景&#xff0c;掌握DuckDB会让你的产品分析能力更强&#xff0c;相反系统运营成本相对较低。为了示例完整&#xff0c;我也提供了如何使用Python导出MongoDB数据。 Apache Parquet文件格式在存储和传输大型数据集方面变得非常流行。最…

Linux网络之TCP

Socket编程--TCP TCP与UDP协议使用的套接字接口比较相似, 但TCP需要使用的接口更多, 细节也会更多. 接口 socket和bind不仅udp需要用到, tcp也需要. 此外还要用到三个函数: 服务端 1. int listen(int sockfd, int backlog); 头文件#include <sys/socket.h> 功能: …

工业相机 SDK 二次开发-Halcon 插件

本文介绍了 Halcon 连接相机时插件的使用。通过本套插件可连接海康 的工业相机。 一. 环境配置 1. 拷贝动态库 在 用 户 安 装 MVS 目 录 下 按 照 如 下 路 径 Development\ThirdPartyPlatformAdapter 找到目录为 HalconHDevelop 的文 件夹&#xff0c;根据 Halcon 版本找到对…

axios架构设计和原理

1. 前端请求方式 原生XHR&#xff1a;最初&#xff0c;在Web开发的早期&#xff0c;前端请求库的唯一选择是使用XMLHttpRequest&#xff08;XHR&#xff09;对象。XHR提供了一种在浏览器中发起HTTP请求的方式&#xff0c;但使用XHR需要编写大量重复的代码&#xff0c;并且缺乏…

网络安全 | 入侵检测系统(IDS)与入侵防御系统(IPS):如何识别并阻止威胁

网络安全 | 入侵检测系统&#xff08;IDS&#xff09;与入侵防御系统&#xff08;IPS&#xff09;&#xff1a;如何识别并阻止威胁 一、前言二、入侵检测系统&#xff08;IDS&#xff09;2.1 IDS 的工作原理2.2 IDS 的技术类型2.3 IDS 的部署方式 三、入侵防御系统&#xff08;…

idea修改模块名导致程序编译出错

本文简单描述分别用Idea菜单、pom.xml文件管理项目模块module 踩过的坑&#xff1a; 通过idea菜单创建模块&#xff0c;并用idea菜单修改模块名&#xff0c;结构程序编译报错&#xff0c;出错的代码莫名奇妙。双击maven弹窗clean时&#xff0c;还是报错。因为模块是新建的&am…

【2024年终总结】深圳工作生活评测

距离上次写年终总结已经过了一年半了&#xff0c;这一年半中哪怕经历了很多的事情&#xff0c;但是感觉又没发生什么。想写一些骚话&#xff0c;却总觉得自己无法完全表达&#xff0c;便也就这样&#xff0c;静静地记录下这一段时光。 现在是2025年&#xff0c;春节前的时光&am…

如何设计浪漫风格的壁纸

一、选择浪漫的色彩 柔和色调&#xff1a; 粉色系&#xff1a;粉色是浪漫的经典色彩&#xff0c;包括淡粉色、玫瑰粉、樱花粉等&#xff0c;能够营造出温馨和甜蜜的氛围。 紫色系&#xff1a;紫色带有神秘和高贵的感觉&#xff0c;如薰衣草紫、淡紫色等&#xff0c;适合营造浪…

element el-table合并单元格

合并 表格el-table添加方法:span-method"” <el-table v-loading"listLoading" :data"SHlist" ref"tableList" element-loading-text"Loading" border fit highlight-current-row :header-cell-style"headClass" …

【unity游戏开发之InputSystem——07】InputSystem+UGUI配合使用(基于unity6开发介绍)

文章目录 一、InputSystem+UGUI配合使用1、官方文档参考2、切换到新的输入模块二、UGUI中的新输入系统输入模块参数相关1、Send Pointer Hover To Parent2、Move Repeat Delay3、Move Repeat Rate4、XR Tracking Origin5、Deselect On Background CLick6、Pointer Behavior7、S…

web端ActiveMq测试工具

如何用vue3创建简单的web端ActiveMq测试工具&#xff1f; 1、复用vue3模板框架 创建main.js,引入APP文件&#xff0c;createApp创建文件&#xff0c;并加载element插件&#xff0c;然后挂载dom节点 2、配置vue.config.js脚本配置 mport { defineConfig } from "vite&qu…

2K高刷电竞显示器推荐

2K高刷电竞显示器推荐&#xff0c;各位喜欢打游戏&#xff0c;身为电竞迷的小伙伴&#xff0c;如果你想选一款2K高刷电竞显示器&#xff0c;那么下面的内容不容错过。 1.HKC G27H4Pro - 2K高刷电竞显示器推荐 外观 - HKC G27H4Pro 2K高刷电竞显示器 初见 HKC G27H4Pro&#x…