当前位置: 首页 > article >正文

Cherno C++ P60 为什么不用using namespace std

这篇文章我们讲一下之前写代码的时候的一个习惯,也就是不使用using namespace std。如果我们接触过最早的C++教程,那么第一节课都会让我们写如下的代码:

#include<iostream>using namespace std;int main() {cout << "Hello World!" << endl;cin.get();
}

非常经典的入门代码。同样也使得using namespace std这句话深入人心了。但是如果我们看之前教程里面的代码,基本上清一色都是不用using而是直接把std写出来,如下所示:

#include<iostream>int main() {std::cout << "Hello World!" << std::endl;std::cin.get();
}

那么问题就来了,为什么我们不使用using namespace std?这样可以省去很多写std::的麻烦,不是么?但是实际上我们不建议这样使用。

我们在使用std::的时候,其实表明的含义是这些是来源于一个名为std的命名空间。如果有一个很长的命名空间或者是自己的命名空间,也许我们可以这样使用。但是对于std来说,写一下std::并不是一件麻烦的事情,但是这样可以很清晰地表明我们这些函数/类是来自于std命名空间内的,所以这是一件很有利的事情。如果没有std::,那我们就无法判断这些个函数变量来源于哪个命名空间,也许我们可以以变量的命名书写规则来进行区分,但是书写风格有的时候其实也是会撞车的。就比如Cherno所在的EA有开发自己的EASTL,命名方式是完全一样的,这个就会带来麻烦和困扰。

我们可以举一个简单的例子来说明如果不指明namespace,会带来哪些问题:

#include<iostream>
#include<string>
#include<algorithm>namespace Apple {void Print(const std::string& str) {std::cout << str << std::endl;}
}namespace Orange {void Print(const char* str) {std::string str_r = str;std::reverse(str_r.begin(), str_r.end());std::cout << str_r << std::endl;}
}int main() {using namespace Apple;using namespace Orange;Print("HelloWorld");std::cin.get();
}

如上所示,我们定义了两个namespace,都是简单的打印函数,其中Orange是反向打印,而Apple是正向打印。我们同时采用using namespace然后看看会发生什么:

很神奇,我们的程序选择了Orange当中的打印。没有发生编译错误,但是运行结果并不一定是我们想要的。这个是因为什么?因为我们输入的对象是一个const char*类型的变量,虽然Apple当中的Print其实也能用,但是它需要进行一次隐藏的类型转换,转换为std::string,那么和Orange当中的Print一比较,编译器就会选择不需要类型转换的Orange当中的函数了。

所以如果我们想要准确的标明我们使用的是哪个命名空间里面的函数,肯定最好写成Orange::或者是Apple::了,但是如果非得就不想这么写行不行呢?也可以,如下所示:

using Apple::Print;
Print("HelloWorld");

这样写的话,那么我们在本作用域内所有的Print就都是Apple当中的Print了。

但是需要注意的一点是,在使用using namespace的时候,一定一定要控制using的适用范围,在一个小作用域内,或者是在一个文件里那是最好不过的。所以千万千万不要把using namespace写到头文件当中!如果这样的话,经过多轮的头文件来回包含,很有可能会导致我们都不知道我们用的是哪个namespace当中的函数了,从而引发代码的错误。所以千万千万不要这样用!

好了以上就是本文的全部内容了,希望大家喜欢!

相关文章:

Cherno C++ P60 为什么不用using namespace std

这篇文章我们讲一下之前写代码的时候的一个习惯&#xff0c;也就是不使用using namespace std。如果我们接触过最早的C教程&#xff0c;那么第一节课都会让我们写如下的代码&#xff1a; #include<iostream>using namespace std;int main() {cout << "Hello …...

大模型微调实验记录(一)数据探索

文章目录 概要整体架构流程前期的技术探索技术构造技术细节小结 概要 根据之前博客使用的docker技术&#xff0c;如果换公司了&#xff0c;我可能就要重新搭建环境了&#xff0c;哎&#xff0c;公司没资源给我&#xff0c;给我一台带不走的电脑&#xff0c;哎&#xff0c;这可…...

JavaWeb-社区版Idea安装配置

idea配置 一&#xff0c;下载idea社区版 百度搜索IntelliJ IDEA&#xff0c;点击下载链接。 二&#xff0c;全局配置 前提安装好jdk&#xff0c;这一步不再赘述。进入引导页&#xff0c;把可以配置的东西都先配置上&#xff0c;这个配置是全局的&#xff0c;省的之后&#…...

iOS 实现UIButton自动化点击埋点

思路&#xff1a;我们HOOK UIControl的 addtarget:action:forControlEvents方法&#xff0c;交换UIControl的 addtarget:action:forControlEvents 方法的实现&#xff0c; 在交换的方法中添加原来响应的同时&#xff0c;再添加一个埋点响应&#xff0c;该响应方法实现了点击埋点…...

商城系统单商户开源版源码

环境配置 1.软件安装 宝塔安装系统软件:Nginx、MySQL5.6、PHP( PHP用7.1-7.4版本)、phpMyAdmin(Web端MySQL管理工具)。 2.配置mysql 设置mysql&#xff0c;在已安装的软件里面找到 mysql点击进行设置 3.修改sql-mode 选择左侧配置修改&#xff0c;找到里面的sql-mode&…...

用不同语言写力扣题的思考:如何选择最适合的编程语言

目录 1. 为什么选择不同的编程语言&#xff1f; 2. 如何根据题目特点选择编程语言&#xff1f; 2.1 题目类型 2.2 个人熟练度 2.3 性能要求 3. 实例分析 3.1 两数之和&#xff08;Two Sum&#xff09; Python 实现 C 实现 3.2 反转链表&#xff08;Reverse Linked Li…...

Python PDF文件拆分-详解

目录 使用工具 将PDF按页数拆分 将PDF的每一页拆分为单独的文件 将PDF按指定页数拆分 根据页码范围拆分PDF 根据指定内容拆分PDF 将PDF的一页拆分为多页 在日常生活中&#xff0c;我们常常会遇到大型的PDF文件&#xff0c;这些文件可能难以发送、管理和查阅。将PDF拆分成…...

ubuntu部署gitlab-ce及数据迁移

ubuntu部署gitlab-ce及数据迁移 进行前梳理: 在esxi7.0 Update 3 基础上使用 ubuntu22.04.5-server系统对 gitlab-ce 16.10进行部署,以及将gitlab-ee 16.9 数据进行迁移到gitlab-ce 16.10 进行后总结: 起初安装了极狐17.8.3-jh 版本(不支持全局中文,就没用了) …...

Y3学习打卡

网络结构图 YOLOv5配置了4种不同大小的网络模型&#xff0c;分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x&#xff0c;其中 YOLOv5s 是网络深度和宽度最小但检测速度最快的模型&#xff0c;其他3种模型都是在YOLOv5s的基础上不断加深、加宽网络使得网络规模扩大&#xff0c;在增强…...

英码科技携昇腾DeepSeek大模型一体机亮相第三届北京人工智能产业创新发展大会

2025年2月28日&#xff0c;第三届北京人工智能产业创新发展大会在国家会议中心隆重开幕。本届大会以"好用、易用、愿用——以突破性创新加速AI赋能千行百业”为主题&#xff0c;重点展示人工智能技术创新成果与产业化应用实践。作为昇腾生态的APN伙伴&#xff0c;英码科技…...

系统讨论Qt的并发编程2——介绍一下Qt并发的一些常用的东西

目录 QThreadPool与QRunnable 互斥机制&#xff1a;QMutex, QMutexLocker, QSemaphore, QWaitCondition 跨线程的通信 入门QtConcurrent&#xff0c;Qt集成的一个并发框架 一些参考 QThreadPool与QRunnable QThreadPool自身预备了一些QThread。这样&#xff0c;我们就不需…...

JS禁止web页面调试

前言 由于前端在页面渲染的过程中 会调用很多后端的接口&#xff0c;而有些接口是不希望别人看到的&#xff0c;所以前端调用后端接口的行为动作就需要做一个隐藏。 禁用右键菜单 document.oncontextmenu function() {console.log("禁用右键菜单");return false;…...

modbus 协议的学习,谢谢老师

&#xff08;1&#xff09;谢谢这位老师 &#xff0c;谢谢老师的教导 &#xff08;2&#xff09; 谢谢...

Go 接口使用

个人学习笔记 接口作用 1. 实现多态 多态允许不同的类型通过实现相同的接口&#xff0c;以统一的方式进行处理。这使得代码更加灵活和可扩展&#xff0c;提高了代码的复用性。 示例代码&#xff1a; package mainimport ("fmt" )// 定义一个接口 type Speaker int…...

题解 | 牛客周赛82 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 判断字符串第一个字符和第三个字符是否相等 import java.io.*; import java.math.*; import java.u…...

命名管道——进程间通信

个人主页&#xff1a;敲上瘾-CSDN博客 匿名管道&#xff1a;进程池的制作&#xff08;linux进程间通信&#xff0c;匿名管道... ...&#xff09;-CSDN博客 一、命名管道的使用 1.创建命名管道 1.1.在命令行中&#xff1a; 创建&#xff1a; mkfifo 管道名 删除&#xff1a…...

高频 SQL 50 题(基础版)_1141. 查询近30天活跃用户数

1141. 查询近30天活跃用户数 select activity_date day,count(distinct user_id) active_users from Activity where (activity_date<2019-07-27 and activity_date>DATE_sub(2019-07-27,INTERVAL 30 DAY)) group by(activity_date)...

Yocto + 树莓派摄像头驱动完整指南

—— 从驱动配置、Yocto 构建&#xff0c;到 OpenCV 实战 在树莓派上运行摄像头&#xff0c;在官方的 Raspberry Pi OS 可能很简单&#xff0c;但在 Yocto 项目中&#xff0c;需要手动配置驱动、设备树、软件依赖 才能确保摄像头正常工作。本篇文章从 BSP 驱动配置、Yocto 关键…...

seaborn中文乱码

在进行matplotlib画图的时候&#xff0c;经常会出现中文乱码的问题,这主要是默认的文件不支持中文,可以在代码中显示指定。解决方法&#xff1a; import seaborn as sns import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"] # …...

函数的特殊形式——递归函数

C递归函数入门指南&#xff1a;从概念到实践 ​1. 什么是递归&#xff1f; 递归是指函数直接或间接调用自身的过程&#xff0c;就像照镜子时影像无限反射&#xff0c;通过不断分解问题解决问题 适用场景&#xff1a; 问题可分解为相同子问题&#xff08;如阶乘、斐波那契数列…...

计算最大海岛面积

最大海岛面积问题的不同解法 问题举例 给定一个包含了一些 0 和 1 的非空二维数组 matrix 。 一个岛屿是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设matrix的四个边缘都被 0&#xff08;代表水&am…...

list的两个实现类

ArrayList&#xff1a;适用于需要频繁随机访问元素 LinkedList&#xff1a;适用于需要频繁进行插入和删除操作&#xff0c;尤其是在列表的头部或尾部进行操作 二者的用法基本一致&#xff0c;只是时间和空间复杂度不同 List<Integer> arrayList new ArrayList<>…...

Spark核心之02:RDD、算子分类、常用算子

spark内存计算框架 一、目标 深入理解RDD弹性分布式数据集底层原理掌握RDD弹性分布式数据集的常用算子操作 二、要点 ⭐️1. RDD是什么 RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做**弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象&#xff0c…...

配置Nginx日志url encode问题

文章目录 配置Nginx日志url encode问题方法1-lua方法2-set-misc-nginx-module 配置Nginx日志url encode问题 问题描述&#xff1a; 当自定义日志输出格式&#xff0c;需要输出http请求中url参数时&#xff0c;如果参数中包含中文&#xff0c;是会进行url encode的&#xff0c…...

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2

Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具&#xff0c;能够批量为视频或音频生成字幕&#xff0c;还支持批量将字幕翻译成其他语言。该工具具有跨平台性&#xff0c;无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…...

AIP-158 分页

编号158原文链接AIP-158: Pagination状态批准创建日期2019-02-18更新日期2019-02-18 API通常需要提供数据集&#xff0c;最常见的是 List 标准方法。但集合大小往往是不受控制的&#xff0c;会随着时间增长&#xff0c;提高了查找时间和通过网络传输的应答大小。因此对集合进行…...

进来了解一下python的深浅拷贝

深浅拷贝是什么&#xff1a;在Python中&#xff0c;理解深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;对于处理复杂的数据结构&#xff0c;如列表、字典或自定义对象&#xff0c;是非常重要的。这两种拷贝方式决定了数据在内存中的复制…...

第三阶段-产品方面的技术疑难

一、虚拟机和容器的区别&#xff1f; 虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;和容器&#xff08;Container&#xff09;都是用于隔离和运行应用程序的技术&#xff0c;但它们在实现方式、性能、资源消耗和适用场景上有显著区别。以下是虚拟机和容器的主…...

safetensors PyTorchModelHubMixin 加载模型

2025.03.03测试ok from safetensors.torch import load_fileimport yamlwith open("configs/maggie_image.yaml", r, encodingutf8) as file: # utf8可识别中文data yaml.safe_load(file)class Config:def __init__(self, **kwargs):for key, value in kwargs.item…...

解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析

每个游戏开发者都有一个共同的愿望&#xff0c;那就是能够在无需复现玩家反馈的卡顿现象时&#xff0c;快速且准确地定位卡顿的根本原因。为了实现这一目标&#xff0c;UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈&#xff0c;旨在为开发团队提供高效、精准的卡顿分析工具。在这篇…...