C++第一节入门

news2024/9/23 0:35:20

一、历史

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中的a
    printf("%d\n",N1::N2::a);   // 访问N2中的a
    printf("%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++语言特有的高级特性,虽然提供了更强大的功能和更好的类型安全性,但也会引入额外的开销。

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

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

相关文章

如何在 Linux 系统中禁用用户登录 ?

管理 Linux 系统上的帐户是系统管理员的一项重要任务。一个常见的任务是禁用帐户&#xff0c;由于各种原因可能需要禁用帐户&#xff0c;例如当员工离开公司或出于安全目的需要临时禁用访问时。 本指南将以简单易懂的步骤引导您完成在 Linux 系统上禁用帐户的过程。 Step 1: …

Ruoyi Cloud 本地启动

参考 http://doc.ruoyi.vip/ https://gitee.com/y_project/RuoYi-Cloud https://blog.csdn.net/cs_dnzk/article/details/135289966 https://doc.ruoyi.vip/ruoyi-cloud/cloud/seata.html#%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D 拉取代码本地跑通 用 git 从 ruoyi 微服务版仓…

HCIA--实验十一:单区域OSPF路由实验

一、实验内容 1.需求/要求&#xff1a; 使用三个路由器互联&#xff0c;各自配置一个loopback接口&#xff0c;在三个路由器上配置ospf动态路由协议&#xff1b; 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.router配置基本信息 各接口的ip地址、loopback接…

华为OD机试真题 - 特殊的加密算法 - 深度优先搜索DFS(Python/JS/C/C++ 2024 D卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

C++:priority_queue(优先级队列)的模拟实现

目录 一、什么是优先级队列 二、优先级队列的定义 三、优先级队列的常用接口 四、模拟实现一个优先级队列 1、posh接口 2、empty接口、size接口和top接口 3、pop接口 4、构造函数 五、整体代码 一、什么是优先级队列 首先优先级队列不是队列&#xff0c;C 中的优先队…

IP包头的总长度字段和UDP包头的长度字段之间的关系

IP包头的总长度字段和UDP包头的长度字段之间的关系&#xff0c;并通过实例加以说明。 IP包头的总长度字段 **总长度&#xff08;Total Length&#xff09;**字段是一个16位的字段&#xff0c;表示整个IP数据包的总长度&#xff0c;包括IP包头和数据部分。单位是字节。由于该字…

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人&#xff0c;是不是经常需要制作各种PPT来分享我的生活和想法。但是&#xff0c;你们知道&#xff0c;有时候灵感来了&#xff0c;时间却不够用了&#xff01;&#x1f629;直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手&#…

PID控制算法(二)

&#xff08;BIlibili借鉴&#xff09;PID参数整定连接&#xff1a;Webpack App (rossning92.github.io) C的基本程序代码&#xff1a; 借鉴链接&#xff1a;PID超详细教程——PID原理串级PIDC代码在线仿真调参-CSDN博客 #include <iostream>using namespace std;stru…

【信创】统信UOS桌面UT-2024-0027漏洞修复

原文链接&#xff1a;【信创】统信UOS系统UT-2024-0027漏洞修复 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于统信UOS桌面操作系统UT-2024-0027漏洞修复的文章。漏洞修复是确保系统安全性的重要步骤&#xff0c;及时更新和修复系统中的安全漏洞&#xff0c;可…

大数据之Flink(三)

9.3、转换算子 9.3.1、基本转换算子 9.3.1.1、映射map 一一映射 package transform;import bean.WaterSensor; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; impor…

Go开源日志库Logrus的使用

一、Logrus简介 Logrus 是一个流行的 Go 语言日志库&#xff0c;以其功能强大、性能高效和高度灵活性而闻名。有关更多介绍可查看 Logrus。 主要特点 丰富的日志级别&#xff1a;Logrus 支持多种日志级别&#xff0c;包括 Debug、Info、Warn、Error、Fatal 和 Panic&#xf…

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中&#xff0c; "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时&#xff0c;经常听到第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;以及 BCNF&#xff08;Boyce-…

RESTful 还是 JSON-RPC

前言 RESTful 比较简单地说就是&#xff0c;大家请求一样的url&#xff08;GET方法有一个例外&#xff0c;url中带了一个id&#xff09;&#xff0c;通过不同的请求方法&#xff0c;分别进行不同的操作&#xff08;CRUD&#xff09;。 JSON-RPC JSON-RPC是一个无状态且轻量级…

SpringBoot学习(7)(Bean对象注册)(自定义组合注解)

目录 一、引言 二、案例学习 &#xff08;一&#xff09;Bean &#xff08;二&#xff09;Import 三、补充 &#xff08;1&#xff09;关于Java中collection.toArray(new String[0])解释 &#xff08;2&#xff09;组合注解 一、引言 上次学习了解到&#xff0c;springb…

基于机器学习的阿尔兹海默症智能分析预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 阿尔兹海默症&#xff08;Alzheimers Disease, AD&#xff09;是一种常见的神经退行性疾病&#xff0c;主要影响老年人的认知功能。随着全球人口老龄化的加剧&#xff0c;阿尔兹海默症的患病率逐年…

nodejs 使用kafka案例,node-red配置kafka案例,从安装配置kafka开始

生产者测试&#xff1a; bin/kafka-console-producer.sh --broker-list 1.2.3.4:9092 --topic test-topic消费者测试&#xff1a; bin/kafka-console-consumer.sh --bootstrap-server 1.2.3.4:9092 --topic test-topic --from-beginningconst { Kafka } require(kafkajs)con…

【AIGC数字人】EchoMimic:基于可编辑关键点条件的类人音频驱动肖像动画

GitHub&#xff1a;https://github.com/BadToBest/EchoMimic 论文&#xff1a; https://arxiv.org/pdf/2407.08136 comfyui&#xff1a; https://github.com/smthemex/ComfyUI_EchoMimic 相关工作 Wav2Lip Wav2Lip是一个开创性的工作 &#xff0c;但输出会出现面部模糊或扭…

粒子群算法原理的示例介绍

一&#xff1a;粒子群优化算法的介绍 粒子群优化算法&#xff08;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;于1995年提出。它受到鸟群狩猎行为的启发&#xff0c;通过模拟鸟群或鱼群的社会行为来进行问题的求解。 基本原理 粒子群算法中&#xff0c;每个解决…

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测&#xff0c;优化前后对比 目录 顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测&#xff0c;优化前后对比预测效果基本介绍…

一种小众且适合发文的智能优化算法应用——三维TSP问题

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天给大家介绍一种非常小众的智能优化算法应用&am…