C++第一节入门
一、历史
C++是在C上继承拓展的!
java是一家公司(甲骨文)借鉴C++生成的!
C#是微软借鉴java生成的!
二、命名空间
当我们定义一个名叫rand的变量,但是由于stdlib头文件里面有个函数跟rand重名!因此会发生命名冲突!
因此为了解决该问题,C++引入了命名空间的定义!
同一个域里面不可以定义同一个变量!
不同的域里面可以定义同一个变量!(局部变量访问优先)
常见的域有:类域、命名空间域、局部域、全局域
#include<stdio.h>
#include<stdlib.h>int a = 0;
int main()
{int a = 1;printf("%d\n", a);printf("%d\n", ::a);return 0;
}
对于上面这段代码, 打印的第一个a为局部变量;第二个::a为全局变量。
::被称为域作用限定域!
::的左边为空白!(空格无影响),表示的就是在全局域访问!
#include<stdio.h>
#include<stdlib.h>
#include<iostream>int a = 0;
namespace bit
{int a = 1;
}
int main()
{// int a = 2;printf("%d\n", a); // 打印结果为0//printf("%d\n", ::a);return 0;
}
默认的访问顺序为 局部域->全局域
如果不指定不会访问命名空间域!(默认不会的)
#include<stdio.h>
#include<stdlib.h>
#include<iostream>//int a = 0;
namespace bit
{int a = 1;
}
int main()
{// int a = 2;printf("%d\n", a);//printf("%d\n", ::a);return 0;
}
代码会直接报错!
有两种方法来访问命名空间域:
- 展开了命名空间域!
- 指定访问的的命名空间域!
1、展开命名空间域
namespace bit
{int a = 1;
}
// 展开命名空间
using namespace bit;
此时相当于将命令空间中的a暴漏在全局域中!
#include<stdio.h>
#include<stdlib.h>
#include<iostream>int a = 0;
namespace bit
{int a = 1;
}
// 展开命名空间
using namespace bit;int main()
{printf("%d\n", a);return 0;
}
此时会报错,a变量不明确!因为两个变量都位于全局域当中!
2、指定命名空间
#include<stdio.h>
#include<stdlib.h>
#include<iostream>int a = 0;
namespace bit
{int a = 1;
}
// 展开命名空间
using namespace bit;int main()
{int a = 2;printf("%d\n", a);printf("%d\n", ::a);printf("%d\n", bit::a);return 0;
}
通过作用域限定符指定命名空间,从而访问bit命令空间里面的变量!
展开指的是编译时是否会去命名空间中搜索!
最好不要轻易将命名空间暴漏给全局域!
3、命名空间的定义
- 正常的命名空间定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}
中即为命名空间的成员。
命名空间中可以定义变量/函数/类型!
namespace bit
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
- 命令空间可以嵌套
namespace N1
{int a = 0;int b;int Add(int left, int right){return left + right;}namespace N2{int a = 2;int d;int Sub(int left, int right){return left - right;}}
}
此时N1和N2的a为两个不同的变量!
int main()
{printf("%d\n",N1::a); // 访问N1中的aprintf("%d\n",N1::N2::a); // 访问N2中的aprintf("%d\n",N1::Add(1,2));return 0;
}
- 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
例如有一个quequ.h的头文件定义了如下:
namespace cc
{int x = 0;
}
有一个stack.h的头文件定义了如下:
namespace cc
{int y = 0;
}
此时如果有一个test.c的文件:
#include"stack.h"
#include"queue.h"int main()
{printf("%d\n",cc::x);printf("%d\n",cc::y);return 0;
}
可以访问x和y!(合并到了一个命名空间!)
如何解决同一个命名空间定义变量名相同的变量?
使用命名空间的嵌套!
std标准库
std也被称作C++标准库,包括STL库和C++库
在C++编程中,using namespace std; 是一条指令,用于告诉编译器在当前作用域中使用标准命名空间(std)。标准命名空间包含了C++标准库中的所有函数、对象和类型,例如cout、cin、vector、string等。
详细解释
- 命名空间(namespace):
命名空间是C++中的一种机制,用于防止命名冲突。标准库中所有的名称都被定义在命名空间std中。例如,标准输出流对象cout的完整名称是std::cout。
- using namespace std;的作用:
当你使用using namespace std;时,你告诉编译器在当前作用域中默认使用std命名空间中的所有名称。这意味着你可以直接使用cout、cin等,而不需要每次都写std::cout、std::cin。
#include <iostream>using namespace std;int main() {cout << "Hello, World!" << endl;return 0;}
在这个例子中,由于使用了using namespace std;,我们可以直接使用cout和endl,而不需要写成std::cout和std::endl。
注意事项
- 命名冲突:
使用using namespace std;可能会导致命名冲突。如果你的代码中包含了与标准库中名称相同的变量或函数名,可能会引发冲突。例如:
#include <iostream>using namespace std;void sort() {// 自己定义的sort函数}int main() {sort(); // 这是调用自己的sort函数还是标准库的sort函数?return 0;}
在这种情况下,编译器可能会产生混淆,不知道你是要调用标准库中的sort函数还是你自己定义的sort函数。
推荐做法:
为了避免命名冲突,许多开发者更倾向于在需要使用标准库名称时显式地使用std::前缀,特别是在大型项目或库开发中。
#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;}
这样可以清楚地知道每个名称的来源,减少命名冲突的风险。
总之,using namespace std; 是一个方便的工具,可以简化代码的书写,但在使用时需要小心,特别是在大型项目中,以避免潜在的命名冲突。
<iostream> 是 C++ 的一个头文件,用于包含输入输出流库。这个库提供了处理输入和输出的功能,例如使用 std::cout 输出到控制台,或使用 std::cin 从控制台读取输入。
总结来说:
- #include<iostream> 用于引入输入输出功能。
- using namespace std; 使得可以直接使用 std 命名空间中的标识符,简化代码书写。
将命名空间中某个成员引入
using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0;
}
可以避免将整个命名空间展开,造成容易出错
总结:命令空间是为了解决C语言的缺陷:即命名冲突!
三、C++输入&输出
std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中!
cout << "hello world";
- 相当于把"hello world"流入到显示器当中!
- cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream >头文件中。
cout << "hello world"<<'\n'<<endl;
- 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。
C++控制输出精度和宽度比较复杂!且不容易记住,建议使用C语言的输出形式控制精度!
printf的输出比C++的cout输出快!
-
缓冲机制:
printf
使用的是C标准库的stdio.h
,其输出是基于缓冲区的。默认情况下,标准输出是行缓冲的,这意味着输出会在遇到换行符时刷新。cout
使用的是C++标准库的iostream
,其输出也是基于缓冲区的,但它还涉及到对象和流操作,这可能会增加一些开销。此外,cout
默认是同步与C的标准输出流(printf
),这也会影响性能。
-
同步机制:
- C++的
iostream
库默认与C标准库的stdio
同步,以确保混合使用printf
和cout
时的输出顺序正确。这种同步机制会带来额外的性能开销。 - 你可以通过调用
std::ios::sync_with_stdio(false);
来禁用这种同步,从而提高cout
的性能:#include <iostream>using namespace std;int main() {ios::sync_with_stdio(false); // 禁用与stdio的同步cout << "Hello, World!" << endl;return 0;}
- C++的
-
格式化和类型安全:
printf
是一个基于格式字符串的函数,它直接操作C风格的字符串,效率较高,但缺乏类型安全和灵活性。cout
是类型安全的,它使用运算符重载来处理不同类型的数据,这虽然带来了更高的灵活性和安全性,但也增加了运行时的开销。
-
模板和流操作:
cout
使用了模板和流操作,这些都是C++语言特有的高级特性,虽然提供了更强大的功能和更好的类型安全性,但也会引入额外的开销。
相关文章:

C++第一节入门
一、历史 C是在C上继承拓展的! java是一家公司(甲骨文)借鉴C生成的! C#是微软借鉴java生成的! 二、命名空间 当我们定义一个名叫rand的变量,但是由于stdlib头文件里面有个函数跟rand重名!因此…...

全能型 AI 的崛起:未来的市场宠儿还是昙花一现?
近日,OpenAI 宣布将在秋季推出代号为“草莓”的新一代 AI 模型。这款 AI 被描述为全能型,从处理复杂的数学问题到应对主观性强的营销策略,它的能力可以覆盖多个领域。听起来像是科技界的“万能钥匙”,无论面对什么问题,…...

如何在PPT中插入已经绘制好的excel表格数据
1、新建一个演示文稿 2、点击“插入—对象” 3、点击“由文件创建—浏览” 4、浏览选择电脑上所处理好的excel表格数据 5、这样就可将excel表格数据插入PPT中...

微积分直觉:隐含微分
目录 一、介绍 二、梯子问题 三、结论 四、一个额外的例子 一、介绍 让我们想象一个半径为 5 的圆,以 xy 平面为中心。现在假设我们想在点 (3,4) 处找到一条切线到圆的斜率。 好吧,为了做到这一点,我们必须非常接近圆和…...

Matlab自学笔记三十五:表table数据与外部文件的读入和写出
1.首先新建一个表变量t xingming{zhangsan;lisi;wangwu}; xuehao{1001;1002;1003}; chengji[89 95;90 87;88 84]; ttable(xingming,xuehao,chengji) 2.把表t的数据写出到student.txt writetable(t,student.txt) %使用writetable函数写出数据到txt文件 3.从student.txt文…...

闯关leetcode——3.Longest Substring Without Repeating Characters
大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ 内容 Given a string s, find the length of the longest substring without repeating characters. Example 1: Input: s “abc…...

Android Radio2.0——公告注册及监听(三)
前面文章内容介绍了 Radio 相关功能的设置,我们知道可以通过设置来监听不同内容的广播公告,但是在开启对应功能的同时,还需要先注册对应公告监听,这里我们就来看一下广播公告监听的注册流程。 一、注册公告 1、接口封装 private final AtomicBoolean mHasRegisterTa = n…...

【C++】类和对象(三)再探构造函数|static成员函数|友元函数|内部类|匿名对象|对象拷贝时的编译优化
欢迎来到HarperLee的学习笔记! 一、再探构造函数 初始化列表:构造函数初始化的第二种方式(第一种是使用函数体内赋值)。使用方式:以一个冒号:开始,用逗号,分隔数据成员列表,每个成员变量后面跟…...

2024中国算力大会 2024 China Computational Power Conference
文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网:https://ais.cn/u/vEbMBz提交检索:EI Compendex、IEEE Xplore、Scopus会议时间:2024年9月27-29日会议地点:…...

jEasyUI 扩展行显示细节
jEasyUI 扩展行显示细节 jEasyUI 是一个基于 jQuery 的前端框架,它提供了一系列的 UI 组件,使得 Web 应用的界面开发变得更加简单快捷。在 jEasyUI 的表格(datagrid)组件中,扩展行显示细节是一个常用的功能,它允许用户通过点击一行来展开更多的信息,这样可以有效地展示…...

YOLOv8+Deepsort+PyQt+GUI 语义分割+目标检测+姿态识别 三者合一(集成于一套系统)综合视觉分析系统
综合视觉分析系统 技术栈: YOLOv8:用于目标检测,是一个快速且准确的目标检测框架。DeepSORT:用于目标跟踪,结合了深度学习特征提取和卡尔曼滤波器来预测目标轨迹。GUI:提供一个直观易用的图形用户界面&am…...

机器学习无监督学习
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 无监督学习概述 1.1 定义与特点 无监督学习是一种数据挖掘技术,它允许机器通过观察数据来学习数据的内在结构和模式,而无需预先标注的输出变量。这种方法特别适用于数据探索和发现隐藏在数据…...

windows10-VMware17-Ubuntu-22.04-海康2K摄像头兼容问题,求解(已解决)
文章目录 1.webrtc camera测试2.ffmpeg 测试3.Ubuntu 自带相机4.解决办法 环境:windows10系统下,VMware的Ubuntu-22.04系统 问题:摄像头出现兼容问题,本来是想开发测试的,Ubuntu方便些。买了海康2K的USB摄像头…...

【系统架构设计师】解释器模式
解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了文法的表示,并定义了一个解释器,该解释器使用该表示来解释语言中的句子。在解释器模式中,通常包括一个抽象语法树(Abstract Synt…...

Hive原理剖析
1. 概述 背景介绍 Apache Hive是一个基于Hadoop的开源数据仓库软件,为分析和管理大量数据集提供了SQL-like的接口。最初由Facebook开发并贡献给Apache,Hive现已成为大数据处理领域的重要工具之一。它将传统的SQL功能与Hadoop的强大分布式处理能力结合&…...

在 Ubuntu 上查看重复文件
一般情况下 1. 使用 fdupes 工具 fdupes 是一个专门用于查找重复文件的工具。 安装: sudo apt-get install fdupes 使用: fdupes -r /path/to/directory -r 选项会递归查找子目录中的重复文件。 2. 使用 rmlint 工具 rmlint 是另一个强大的重复文件查找工具…...

docker容器高效连接 Redis 的方式
在微服务架构中,Redis 是一种常见的高效缓存解决方案,通常用于存储临时数据、会话信息或 token。如何在服务容器中高效、稳定地连接 Redis 是架构设计中的一个重要环节。 这篇博客将以实际项目为例,详细介绍如何配置 Flask 应用中的服务容器…...

手撕Python之生成器、装饰器、异常
1.生成器 生成器的定义方式:在函数中使用yield yield值:将值返回到调用处 我们需要使用next()进行获取yield的返回值 yield的使用以及生成器函数的返回的接收next() def test():yield 1,2,3ttest() print(t) #<generator object test at 0x01B77…...

LabVIEW步进电机控制方式
在LabVIEW中控制步进电机可以通过多种方式实现。每种方法都有其独特的优缺点,适用于不同的应用场合。下面详细介绍几种常见的步进电机控制方式,并进行比较。 1. 开环控制(Open-Loop Control) 特点 通过定期发出脉冲信号来控制步进…...

vllm源码解析(五):LLM模型推理
八 模型推理细节探索 8.1 回顾下step的流程 def step(self) -> List[Union[RequestOutput, EmbeddingRequestOutput]]:# 多GPU并行推理时走AsyncLLMEngine分支。如果进入当前LLMEngine,性能会下降,这里会抛出异常。if self.parallel_config.pipeline_parallel_s…...

数学建模笔记——熵权法(客观赋权法)
数学建模笔记——熵权法[客观赋权法] 熵权法(客观赋权法)1. 基本概念2. 基本步骤3. 典型例题3.1 正向化矩阵3.2 对正向化矩阵进行矩阵标准化3.3 计算概率矩阵P3.4 计算熵权3.5 计算得分 4. python代码实现 熵权法(客观赋权法) 1. 基本概念 熵权法,物理学名词,按照信息论基本原…...

XGBoost算法-确定树的结构
我们在求解上面的w和obj的过程中,都是假定我们的树结构是确定的,因为当我们改变树中划分条件的时候,每个叶子节点对应的样本有可能是不一样的,我们的G和H也是不一样的,得到的最优w和最优obj肯定也是不一样的。 到底哪一…...

concurrentHashMap线程安全实现的原理
1. Segment 数组 ConcurrentHashMap 内部维护一个 Segment 数组,每个 Segment 都是一个小型的 HashMap。Segment 继承自 ReentrantLock,因此每个 Segment 都是一个可重入锁。 2. 并发级别 ConcurrentHashMap 在构造时可以指定并发级别(con…...

域名证书,泛域名证书,sni
文章目录 前言一、证书1.全域名证书2.泛域名证书 二、域名证书的使用1、浏览器请求域名证书流程对全域名证书的请求流程对泛域名证书的请求流程ssl client-hello携带server name 报文 2、浏览器对证书的验证流程 三、域名证书和sni 前言 本文介绍了泛域名证书和全域名证书的区别…...

Pytest夹具autouse参数使用。True表示会自动在测试中使用,而无需显式指定
1. 全局conftest文件日志记录功能 # 当前路径(使用 abspath 方法可通过dos窗口执行) current_path os.path.dirname(os.path.abspath(__file__)) # 上上级目录 ffather_path os.path.abspath(os.path.join(current_path,"../"))LOG_FILE_PATH f{ffather_path}/lo…...

Linux:归档及压缩
tar命令 • tar 集成备份工具 – -c:创建归档 – -x:释放归档 – -f:指定归档文件名称,必须在所有选项的最后 – -z、-j、-J:调用 .gz、.bz2、.xz 格式工具进行处理 – -t:显示归档中的文件清单 – -C:指定…...

jenkins 安装
jenkins安装 jenkins官网 中文网址 安装设置 所有jenkins版本 内存512M以上,10Gb磁盘;安装jdk,需要java8以上下载较新的版本,否则安装插件时可能报错版本过低 # 搜索java yum search java | grep -iE "jdk"# 安装jd…...

mysql学习教程,从入门到精通,MySQL 删除数据库教程(6)
1、MySQL 删除数据库 使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限。 在删除数据库过程中,务必要十分谨慎,因为在执行删除…...

C语言:刷题日志(2)
一.币值转换 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代…...

微带结环行器仿真分析+HFSS工程文件
微带结环行器仿真分析HFSS工程文件 工程下载:微带结环行器仿真分析HFSS工程文件 我使用HFSS版本的是HFSS 2024 R2 参考书籍《微波铁氧体器件HFSS设计原理》和视频微带结环行器HFSS仿真 1、环形器简介 环行器是一个有单向传输特性的三端口器件,它表明…...