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…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...