C++入门基础(一)

目录

  • C++关键字
  • 命名空间
    • 命名冲突例子
    • 域的概念理解
    • 命名空间定义
      • 例子1
      • 例子2
      • 例子3
      • 例子4
      • 例子5
      • 例子6
      • 例子7
  • C++输出与输入
    • 输出
    • 输入

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录

C++关键字

C++总共有63个关键字,相对于C语言的32个关键字增加了接近一倍,并且C语言的关键字在C++也是可以用的
在这里插入图片描述

命名空间

在C/C++中,变量、函数和类都是经常出现的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

命名冲突例子

#include<stdio.h>
int rand = 1;
int main()
{
	printf("%d", rand);
return 0;
}

这个代码中我们定义了一个整形rand,然后输出rand的值
在这里插入图片描述
运行结果输出也是1

但是当我们再增加一个头文件#include<stdlib.h>后就不一样了
在这里插入图片描述

这就是C语言中的命名冲突,因为包含了头文件#include<stdlib.h>后会展开,而rand函数就在这个头文件里,rand函数是一个全局函数,而代码中又定义了一个全局变量,所以在运行时会冲突

域的概念理解

不同的域是否可以定义同一个全局变量,我们来看看下面的代码

#include<stdio.h>
int x=1;
int main()
{
	int x = 0;
	printf("%d", x);
return 0;
}

在这里插入图片描述
不同的域是可以定义同一个变量的,但同一个域不可以定义两个相同的变量

因为C语言有就近原则,x=0在局部域,x=1在全局域,所以当运行程序的时候,编译器会优先查找最近的x,如果局部域没有找到x,那么就会去全局域找
在这里插入图片描述
如果全局域和局部域都定义了x,而我们只想打印全局域中x的值,那么有以下方法

方法一:定义一个函数,返回全局域x的值
在这里插入图片描述

方法二 域作用限定符
在这里插入图片描述
注意 ::x中的::左边是空的默认为全局域

有了域作用限定符后我们需要知道哪些可以成为域

C++有这几种域:全局域 局部域 命名空间域 类域

总结:命名冲突的原因就是程序员命名的函数或者变量与库中的函数和变量名称相同导致的(这里的库包括C语言自带的库和别人写的库),C语言中的域坚持就近原则,为了避免命名冲突,有了域作用限定符

命名空间定义

定义命名空间,需要使用到namespace(名字空间)关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

例子1

#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>

namespace jack1
{
	int x = 0;
}
namespace jack2
{
	int x = 1;
}

int main()
{
	printf("%d ", jack1::x);
	printf("%d ", jack2::x);
return 0;
}

在这里插入图片描述这里的两个x都是全局变量,只不过被封装起来放进不同的命名空间域中

命名空间域和全局域与局部域不同,全局域和局部域即会影响生命周期又会影响访问(全局域和局部域的生命周期不一样,并且访问的时候要指定),而命名空间域只是影响访问,不会影响生命周期

编译器有这样一个搜索原则
先搜索当前局部域,再搜索全局域,如果指定搜索了哪块域,就直接去指定域搜索

下面就是没有指定域,导致编译器找不到
在这里插入图片描述

例子2

两个命名空间的名字是可以一样的,只不过最后运行的时候会将名字一样的合并

namespace jack1
{
	int x = 0;
}
namespace jack1
{
	int y = 1;
}

int main()
{
	printf("%d ", jack1::x);
	printf("%d ", jack1::y);
return 0;
}

在这里插入图片描述
但是如果两个名字相同的命名空间,内部的变量名相同就会报错(因为最后会合并,导致同一个命名空间中有两个相同的变量)
在这里插入图片描述

例子3

命名空间里面可以定义函数和结构体…
在这里插入图片描述
需要注意的是结构体有点特殊,他并不是jack1::struct Node phead,而是struct jack1::Node phead

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
namespace jack1
{
	int rand = 0;
	int x = 1;
	int Add(int a, int b)
	{
		return a + b;
	}
	struct Node
	{
		struct Node* next;
		int val;
	}nd;
}

int main()
{
	printf("%d ", jack1::rand);
	printf("%d ", jack1::x);
	printf("%d ", jack1::Add(1,2));
	struct jack1::Node phead;
	phead.val = 4;
	phead. next = NULL;
	printf("%d ", phead.val);
return 0;
}

在这里插入图片描述

例子4

在写代码我们经常创建多个文件,这些文件中,也常常有命名冲突的问题

//Queue.h头文件
#pragma once
struct Queue
{
	struct Node* head;
	struct Node* tail;
	int size;
};
struct Node
{
	int val;
	struct Node* next;
};
//List.h头文件
#pragma once
struct Node
{
	int val;
	struct Node* next;
	struct Node* prev;
};
//test.cpp文件
#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include"Queue.h"
#include"List.h"

int main()
{
return 0;
}

由于List.h和Queue.h两个头文件中有冲突的结构体定义,导致最后会报错
在这里插入图片描述
这个时候我们就需要定义命名空间

//Queue.h头文件
#pragma once
namespace jack1
{
	struct Queue
	{
		struct Node* head;
		struct Node* tail;
		int size;
	};
	struct Node
	{
		int val;
		struct Node* next;
	};
}
//List.h头文件
#pragma once
namespace jack2
{
	struct Node
	{
		int val;
		struct Node* next;
		struct Node* prev;
	};
}

在这里插入图片描述

例子5

不同的文件也可以定义同一个命名空间,只要内部不冲突就行,在我们日常练习时,频繁展开命名空间会非常麻烦

int main()
{
	struct jack2::Node node1;
	struct jack2::Node node2;
	struct jack2::Node node3;
return 0;
}

名次想要定义一个结构体时都要用一次域作用限定符,为了方便我们可以直接展开命名空间using namespace jack2,当展开后不需要域作用限定符就可以直接用里面的东西,也就是一次搞定

#include<iostream>
#include"Queue.h"
#include"List.h"
using namespace std;
using namespace jack2;
int main()
{
	struct Node node1;
	struct Node node2;
	struct Node node3;
return 0;
}

代码中有一句using namespace std,std是C++所有库的命名空间,我们用一个例子来讲解

#include是c++的一个头文件,当我们包含了头文件后,按理说头文件里的东西是可以直接用的,但是运行时却报错了
在这里插入图片描述

当加上using namespace std后,程序就可以正常运行
在这里插入图片描述
如果我们不包含头文件,而只展开命名空间也是报了相同的错误
在这里插入图片描述
当我们单独用域作用限定符后,程序又可以正常运行了
在这里插入图片描述

根据上面的结果我们可以得出一个结论:

包含头文件后,头文件里面的东西被命名空间std给封装起来了,所以如果只包含了头文件,没有展开命名空间是用不了里面的东西

只展开命名空间,没有包含头文件,由于没有头文件,导致库里的东西我们无法使用

注意:命名空间展开后就相当于一个全局变量,如果存在一个局部变量和命名空间中变量名称相同,会优先使用局部变量

例子6

命名空间是可以嵌套的

#include<iostream>
//using namespace std;
using std::cout;
using std::endl;
namespace jack1
{
	namespace jack2
	{
		namespace jack3
		{
			void printf3()
			{
				cout << "jack3" << endl;
			}
		}
	}
	namespace jack4
	{
		void printf4()
		{
			cout << "jack4" << endl;
		}
	}
}
int main()
{
	jack1::jack2::jack3::printf3();
	jack1::jack4::printf4();
	return 0;
}

在这里插入图片描述

例子7

输入和输出在代码中是非常常见的操作,日常练习中我们可以用using namespace std去展开命名空间,但是在正式的项目中,如果直接展开命名空间,会导致命名冲突,为了减少这种情况的发生,C++可以选择只展开命名空间中常用的几个

#include<iostream>
//using namespace std;
using std::cout;
using std::endl;
int main()
{
	cout << "hello world" << endl;
return 0;
}

C++输出与输入

输出

#include<iostream>
using std::cout;
using std::endl;
int main()
{
	int i = 9;
	i=i << 1;
	cout <<"hello world  " << i<<endl ;
	return 0;
}

在这里插入图片描述
cout的意思为console out(控制台输出)就是将数据输出进控制台,而cout右边的<<为流插入符号,意思就是数据像流一样流入,流插入符号与C语言的左移操作符相同,并且C++中依然可以使用左移操作符,

C语言的输出为printf函数,根据上面的代码我们可以看到,C++支持连续输出,并且有着自动识别类型的功能(C语言在输出的时候,需要表明i的具体类型,而C++不需要)
在这里插入图片描述
上图中并没有’\n’,但是输出的结果却意外的换行了,其实是因为有endl=endline(结束线),我们可以把他等价于’\n’,所以endl可以换成’\n’
在这里插入图片描述

输入

cin>>表示输入,>>在C语言中为右移操作符,在C++的输入中表示流提取,意思就是将数据流入,然后提取出来

和输出相同,输入可以连续的流提取
在这里插入图片描述
在C语言中有时会涉及到精度问题,比如一个double类型的变量,要求精确到小数点后一位,C语言是用%.x来表示精确到小数点的第x位
在这里插入图片描述
C++也是可以的,只不过有点麻烦,但是C++是兼容C语言的,所有我们遇到这种情况可以直接用C语言的方法去解决

这里解释一下,图中没有包含#include<stdio.h>头文件,但是却可以用printf函数,是因为不同的平台的库实现是不一样的,可能VS中的#include < iostream>里面间接包含了printf函数,所以可以正常运行,但是在其他平台上就不一定了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车底盘域的学习笔记

前言&#xff1a;底盘域分为传统车型底盘域和新能源车型底盘域&#xff08;新能源系统又可以分为纯电和混动车型&#xff0c;有时间可以再研究一下&#xff09; 1&#xff1a;传统车型底盘域 细分的话可以分为四个子系统 传动系统 行驶系统 转向系统 制动系统 1.1传动系…

计算机体系结构:向量体系结构介绍

向量体系结构介绍 什么是向量&#xff1f; 在计算机体系结构&#xff0c;"向量"&#xff08;vector&#xff09;是指一个由多个相同类型且逻辑上相关的数据元素组成的有序集合。这些元素可以是整数、浮点数、布尔值或其他数据类型&#xff0c;它们在内存中连续存储…

SpringSecurity + Oauth2 + jwt实现单点登录

文章目录 前言一、springsecurity oauth2 redis方式的缺点二、oauth2认证的4种模式的选择三、认证服务器的编写 第一步、创建WebSecurity配置类第二步、创建jwt仓库配置类第三步、创建UserDetailsService类第四步、创建认证服务器配置类 四、测试认证服务器的功能 1.创建Login…

墨水屏技术在工业智能化领域的创新应用

墨水屏技术在工业智能化领域的创新应用 随着科技的快速发展&#xff0c;各种显示技术层出不穷&#xff0c;其中墨水屏作为一种独特的显示技术&#xff0c;逐渐在工业领域展现出其独特的优势和价值。墨水屏以其低功耗、高对比度和阅读舒适度高等特点&#xff0c;正成为工业应用…

uniapp-css多颜色渐变:左右+上下

案例展示 案例代码&#xff1a; 代码灵感&#xff1a;使用伪类进行处理 <view class"headBox"></view>.headBox {height: 200rpx;background: linear-gradient(to right, #D3D5F0, #F0DCF3, #F7F6FB, #DAE8F2, #E1D3EE);position: relative; }.headBox…

【C++】哈希思想

目录 哈希介绍&#xff1a; 一&#xff0c;位图 1-1&#xff0c;位图的认识 1-2&#xff0c;位图的简单实现 1-3&#xff0c;位图的应用 二&#xff0c;布隆过滤器 2-1&#xff0c;布隆过滤器的认识 2-2&#xff0c;布隆过滤器的简单实现 2-3&#xff0c;布隆过滤器的…

3d设计网站有哪些(1)?渲染100邀请码1a12

做3d设计需要各类资源&#xff0c;比如模型、材质、贴图等&#xff0c;如果这些都要自己做会非常麻烦&#xff0c;所幸现在有网站可以下载&#xff0c;有的免费有的收费&#xff0c;这篇文章我就先分享几个给有需要的朋友看看吧。 1、Pikbest Pikbest成立于2018年7月12日&…

万辰集团如何破局“增收不增利”的困境?

在波澜不惊的食用菌加工行业&#xff0c;万辰集团&#xff08;300972.SZ&#xff09;曾是一名平凡的参与者。2021年战略转型的号角吹响&#xff0c;万辰集团挥别了传统业务&#xff0c;转而投身于快速增长的量贩零食市场&#xff0c;并迅速扩张到成为这一领域的重要玩家。万辰的…

TDSQL手动调整备份节点或冷备节点

一、背景描述 近期TDSQL数据库备份不稳定&#xff0c;有些set实例的备份任务未自动发起。经排查分析&#xff0c;存在多个set实例容量已经超过TB级别&#xff0c;且冷备节点都是同一台。因此&#xff0c;需要手动将当前备份节点改到其他备节点&#xff0c;开启增量备份&#x…

C语言笔试题之重排链表

重排链表 实例要求 1、给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln2、请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …3、不能只是单纯的改变节点内部的值&#xff0c;而是…

高级STM32应用开发:使用HAL库和RTOS

引言 STM32系列微控制器以其高性能、丰富的外设支持和低功耗特性&#xff0c;在工业、汽车及消费电子市场中占有显著地位。 下面我们旨在探讨STM32的高级开发技术&#xff0c;包括硬件抽象层&#xff08;HAL&#xff09;库的使用和实时操作系统&#xff08;RTOS&#xff09;的…

python批量删除文件

python批量删除文件 1、查询与删除2、添加模块到地址中3、批量删除多个路径中不需要导出的文件 1、查询与删除 mport osdef get_files_in_folder(folder_path):files []for file in os.listdir(folder_path):if os.path.isfile(os.path.join(folder_path, file)):files.appen…

Kafka 生产者应用解析

目录 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 2.2、带回调函数的异步发送 3、同步发送 API 4、生产者分区 4.1、分区的优势 4.2、生产者发送消息的分区策略 示例1&#xff1a;将数据发往指定 partition 示例2&#xff1a;有 key 的…

大数据—数仓分层概论

数据仓库&#xff08;Data Warehouse&#xff09;是一个用于集成和存储大量数据的系统&#xff0c;旨在支持企业的决策制定过程。它是一个面向主题的、集成的、非易失的数据集合&#xff0c;用于支持管理决策制定过程。数据仓库的发展源于企业对数据分析和决策支持的需求&#…

tcp服务器端与多个客户端连接

如果希望Tcp服务器端可以与多个客户端连接&#xff0c;可以这样写&#xff1a; tcpServernew QTcpServer(this);connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection())); void MainWindow::onNewConnection() {QTcpSocket *tcpSocket;//TCP通讯的Sockettcp…

Linux系统安全及应用(1)

目录 一.账号安全控制 系统账号清理 二.密码安全控制 密码安全控制 三.命令历史限制 命令历史限制 四.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 ​编辑五.PAM认证的构成 六.使用sudo机制提升权限…

PT Application Inspector 4.5 (Linux) - 静态、动态和交互式应用程序安全测试

PT Application Inspector 4.5 (Linux) - 静态、动态和交互式应用程序安全测试 唯一一款提供高质量分析和便捷工具以自动确认漏洞的源代码分析器 请访问原文链接&#xff1a;PT Application Inspector 4.5 (Linux) - 静态、动态和交互式应用程序安全测试&#xff0c;查看最新…

自定义一个RedisTemplate

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis&…

【09-选择合适的评估指标:Scikit-learn中的性能度量】

文章目录 前言1. 了解评估指标的重要性2. 分类问题的评估指标准确率精确率和召回率F1分数混淆矩阵ROC曲线和AUC3. 回归问题的评估指标均方误差(MSE)均方根误差(RMSE)平均绝对误差(MAE)R分数4. 如何选择评估指标5. 使用Scikit-learn选择评估指标结论前言 在机器学习中,评…

跳出框架:Facebook的创新策略与社交影响

1. 引言 在数字化时代&#xff0c;社交媒体如同一面镜子&#xff0c;反映出我们社会的多元性和变革。Facebook&#xff0c;作为这面镜子中最明亮的一个&#xff0c;不仅改变了人们的日常生活&#xff0c;更深刻地塑造了社交、文化和经济的面貌。本文将深入探讨Facebook的创新策…
最新文章