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.hqwc.cn/news/652345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端开发之CSS_1

CSS选择器字体属性背景属性文本属性表格属性 1. CSS 1.1 CSS简介 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表。CSS文件后缀名为 .css 。CSS用于HTML文档中元素样式的定义。使用CSS可以让网页具有美观一致…

18 JavaScript学习:错误

JavaScript错误 JavaScript错误通常指的是在编写JavaScript代码时发生的错误。这些错误可能是语法错误、运行时错误或逻辑错误。以下是对这些错误的一些常见分类和解释&#xff1a; 语法错误&#xff1a; 这类错误发生在代码编写阶段&#xff0c;通常是由于代码不符合JavaScrip…

python学习笔记----python基础语法(二)

一、字面量 在 Python 中&#xff0c;字面量 是一种直接在代码中表示其自身值的数据。字面量用于创建值&#xff0c;并且可以直接被 Python 的解释器识别和处理。不同类型的数据有不同的字面量形式。下面是一些常见的字面量类型&#xff1a; 二、注释 注释&#xff1a;在程序…

LeetCode in Python 74/240. Search a 2D Matrix I/II (搜索二维矩阵I/II)

搜索二维矩阵I其实可以转换为搜索一维数组&#xff0c;原因在于&#xff0c;只要先确定搜索的整数应该在哪一行&#xff0c;即可对该行进行二分查找。 搜索二维矩阵II中矩阵元素排列方式与I不同&#xff0c;但思想大致相同。 目录 LeetCode in Python 74. LeetCode in Pyth…

基于java+springboot+vue实现的医疗挂号管理系统(文末源码+Lw)203

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对医疗挂号信息管理的提升&#x…

如何增强交友、婚恋平台、金融等平台的安全性

运营商二要素核验是一种数字身份验证方法&#xff0c;主要使用用户的手机号码和姓名作为核验要素。这两个要素被认为是最基本的用户身份信息&#xff0c;通过运营商的数据库来核实其真实性。 在实际操作中&#xff0c;用户需要提供手机号码和姓名进行验证。应用系统会调用接口…

绘唐3AIGCMJ提示词推导指令

绘唐3AIGCMJ提示词推导指令Docshttps://qvfbz6lhqnd.feishu.cn/wiki/D3YLwmIzmivZ7BkDij6coVcbn7W # Role: 小说导演 ## Profile *Author*: X *Version*: 1.0 *Language*: 中文 *Description*: 这个角色会对用户输入的小说文本内容进行分析&#xff0c;然后用适用于midjourne…

Facebook的未知力量:数字世界的新引擎

在数字化的时代&#xff0c;社交媒体已经成为了我们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;其影响力远远超出了我们的想象。但是&#xff0c;Facebook背后隐藏的力量和影响远不止于此&#xff0c;它正逐渐成为数字世界的新引擎&#xff0…

python-pytorch官方示例Generating Names with a Character-Level RNN的部分理解0.5.03

pytorch官方示例Generating Names with a Character-Level RNN的部分理解 模型结构功能关键技术模型输入模型输出预测实现 模型结构 功能 输入一个类别名和一个英文字符&#xff0c;就可以自动生成这个类别&#xff0c;且以英文字符开始的姓名 关键技术 将字符进行one-hot编…

Kafka 3.x.x 入门到精通(06)——Kafka进阶

Kafka 3.x.x 入门到精通&#xff08;06&#xff09;&#x1f449;&#x1f449;&#x1f449;&#x1f449; Kafka进阶 3. Kafka进阶3.1 Controller选举3.2 Broker上线下线3.3 数据偏移量定位3.4 Topic删除3.5 日志清理和压缩3.7 页缓存3.8 零拷贝3.9 顺写日志3.10 Linux集群部…

Linux驱动开发——(四)内核定时器

目录 一、内核的时间管理 1.1 节拍率 1.2 全局变量jiffies 1.3 绕回 二、内核定时器 2.1 简介 2.2 定时器API函数 2.2.1 init_timer函数 2.2.2 add_timer函数 2.2.3 del_timer函数 2.2.4 del_timer_sync函数 2.2.5 mod_timer函数 2.3 Linux内核短延时函数 三、驱…

C++ 头文件/宏冲突问题解决?如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…