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

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输出快!

  1. 缓冲机制

    • printf 使用的是C标准库的 stdio.h,其输出是基于缓冲区的。默认情况下,标准输出是行缓冲的,这意味着输出会在遇到换行符时刷新。
    • cout 使用的是C++标准库的 iostream,其输出也是基于缓冲区的,但它还涉及到对象和流操作,这可能会增加一些开销。此外,cout 默认是同步与C的标准输出流(printf),这也会影响性能。
  2. 同步机制

    • 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;}​
  3. 格式化和类型安全

    • printf 是一个基于格式字符串的函数,它直接操作C风格的字符串,效率较高,但缺乏类型安全和灵活性。
    • cout 是类型安全的,它使用运算符重载来处理不同类型的数据,这虽然带来了更高的灵活性和安全性,但也增加了运行时的开销。
  4. 模板和流操作

    1. cout 使用了模板和流操作,这些都是C++语言特有的高级特性,虽然提供了更强大的功能和更好的类型安全性,但也会引入额外的开销。

相关文章:

C++第一节入门

一、历史 C是在C上继承拓展的&#xff01; java是一家公司&#xff08;甲骨文&#xff09;借鉴C生成的&#xff01; C#是微软借鉴java生成的&#xff01; 二、命名空间 当我们定义一个名叫rand的变量&#xff0c;但是由于stdlib头文件里面有个函数跟rand重名&#xff01;因此…...

全能型 AI 的崛起:未来的市场宠儿还是昙花一现?

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

如何在PPT中插入已经绘制好的excel表格数据

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

微积分直觉:隐含微分

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

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的学习笔记&#xff01; 一、再探构造函数 初始化列表&#xff1a;构造函数初始化的第二种方式&#xff08;第一种是使用函数体内赋值&#xff09;。使用方式&#xff1a;以一个冒号:开始&#xff0c;用逗号,分隔数据成员列表&#xff0c;每个成员变量后面跟…...

2024中国算力大会 2024 China Computational Power Conference

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

jEasyUI 扩展行显示细节

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

YOLOv8+Deepsort+PyQt+GUI 语义分割+目标检测+姿态识别 三者合一(集成于一套系统)综合视觉分析系统

综合视觉分析系统 技术栈&#xff1a; YOLOv8&#xff1a;用于目标检测&#xff0c;是一个快速且准确的目标检测框架。DeepSORT&#xff1a;用于目标跟踪&#xff0c;结合了深度学习特征提取和卡尔曼滤波器来预测目标轨迹。GUI&#xff1a;提供一个直观易用的图形用户界面&am…...

机器学习无监督学习

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

windows10-VMware17-Ubuntu-22.04-海康2K摄像头兼容问题,求解(已解决)

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

【系统架构设计师】解释器模式

解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了文法的表示&#xff0c;并定义了一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。在解释器模式中&#xff0c;通常包括一个抽象语法树&#xff08;Abstract Synt…...

Hive原理剖析

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

在 Ubuntu 上查看重复文件

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

docker容器高效连接 Redis 的方式

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

手撕Python之生成器、装饰器、异常

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

LabVIEW步进电机控制方式

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

vllm源码解析(五):LLM模型推理

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

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...