打开C嘎嘎的大门:你好,C嘎嘎!(1)

news2024/11/13 9:37:08

前言:

  小编在学习完一些数据结构以后,终于,我还是来到了这一步,开始学习我小学就听说过的C++,至于为什么标题写的C嘎嘎,因为小编觉着这样好念而且有意思,今天是小编学习C嘎嘎的第一天,为了不让我越学就忘记前面的知识,于是诞生了这一篇文章,那么现在废话不多说,开启今天的C嘎嘎之旅!


目录

❀1.C嘎嘎是什么

❀2.命名空间

❀2.1.命名空间的概念和定义

 2.1.1.引例

 2.1.2.命名空间的概念

2.1.3.命名空间的定义

❀2.2.命名空间的使用

2.2.1.域作用限定符    " :: "

2.2.2.第二种使用方法:用using展开所有成员(不推荐使用)

2.2.3.第三种使用办法:using展开部分成员

❀3.C嘎嘎的输入 && 输出 

❀3.1.输出函数——cout

 3.1.1.cout函数的概念

❀3.2.输入函数——cin

3.2.1.cin函数的概念

❀❀❀ 总结❀❀❀


正文:

❀1.C嘎嘎是什么

  C嘎嘎的发明是咱们祖师爷——本贾尼教授在1979年在使用C语言的时候越来越发现C语言的一些不足,于是后来就自己开始在C语言的基础上开始增强C语言的功能(我真的佩服这些发明语言的大佬们,他们觉着语言不行就开始自己发明语言,而小编只会在各种社交app上吐槽,这就是差距),后来增加的功能越来越多,这时候就诞生了现在小编所讲的:C++!

  所以说,C++其实就是C语言的一个更高级的版本,它同样是可以用C语言的一些功能的,这个小编后续讲的时候会体现出来,至于C嘎嘎之后的一些历史,小编就不多叙述了,小编文笔不太行贿,讲不了历史,下面就进入C嘎嘎的学习喽!

❀2.命名空间

  命名空间是C嘎嘎比C语言多出来的功能,也是和我们之后学习息息相关的一个内容,大家一定要好好理解这个:

❀2.1.命名空间的概念和定义

 2.1.1.引例

  在讲命名空间的概念之前,小编先给各位一段代码让各位判断这个代码对不对:

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

   这个代码看上去是非常正确的,无非就是设置了一个全局变量,然后打印出变量的内容罢了,想必各位读者朋友也是这么想的,的确,这个代码是正确的,那么小编再给各位一段代码,让大家来判断这个代码是否是正确的:

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

  到这里很多读者朋友可能会有疑问了,这个代码和上面那个·代码不就多了一个头文件吗,这俩不应该是一样的吗?其实小编这里给大家埋了个坑,请各位读者朋友看我变量名是什么:rand,这个可能很多小伙伴见过,这是一个生成随机数(伪)的库函数,小编也在之前的扫雷游戏中用过这个库函数,小编给大家看看这个库函数的介绍:

  所以说上面那个代码使用起来是会报错的,下面给大家展示一下报错原因:

  当然,如果rand在函数内部是不会报错的,因为在函数内部属于局部变脸,想要打印它的时候,编译器会首先在main函数内部查找,然后再往后上找,rand属于全局变脸,头文件会在预编译的的时候打开,二者都在全局,所以会重定义,那么,如果我们非要让rand作为全局变量,然后也可以使用它我们有什么方法可以实现这个操作呢?既然小编这么说了,解决办法肯定是有的,那么小编就要进入本小节所要讲的:命名空间了。

 2.1.2.命名空间的概念

  命名空间的存在,实际上就是为了解决小编前面说过的,为了让我们既可以使用rand函数,也可以使用全局变量rand,命名空间就是解决这个问题的关键,命名空间实际上的作用就是来隔离名字的,为了解决一些程序中由于名字冲突或者名字污染而带来的一些问题,C嘎嘎特地引入了命名空间来解决,它在编译器是用namespace关键字来表示的,下面小编讲述一下namespace的一些定义来帮助大家理解namespace是如何在代码中进行表示的:

2.1.3.命名空间的定义

  1.在定义命名空间的时候,就需要用到namespace关键字,后面需要跟着名字(自己设定的,可以把它想成我们在使用结构体时对结构体命名),之后跟着一对{}即可,里面的内容可以是变量,函数,结构体等等,下面小编用代码来展示一下它的定义方法:

namespace wang
{
   int rand = 20;
   int add(int a,int b)
{
   return a + b;
}
   struct wang1
{
   char arr[12];
   int* arr1;
};
}

  2.namespace其实本义是定义出了一个域,这个域就叫命名空间域,这个域跟全局域是隔离出来的,所以在里面放入rand函数的时候就可以不和全局域中的rand函数起冲突了,读到这里,可能会有许多读者朋友会好奇域到底是什么东西,下面小编就来介绍一下:  在C++中有着四种域,分别是全局域(就是全局变量呆着的地方),函数局部域(例如main函数内部的内容都属于函数局部域),命名空间域(上面讲的,把一些重复的名字隔离出来的域),类域(后期会学,这个我现在也不懂,我刚学C嘎嘎)。所以这里就解释了为什么命名空间可以把变量给隔离出来,因为域本身就是不同的,并且,局部域和全局域是会影响生命周期的(这个在C的时候学过),对于什么是生命周期,用小编的话来说,生命周期就是一个变量从出生到销毁的过程,那么小编这里给读者朋友出一个问题,对于命名空间里的数据,他是属于全局变量还是局部变量?其实它是全局变量,因为命名空间仅仅是对名字进行隔离,除去命名空间这些内容还是在全局中。

  3.namespace命名空间是可以进行嵌套的,那么为什么要去嵌套呢?小编这里就举一个例子来说,我们首先先设置一个域定为wang,有一天我和小明在编写项目的时候,我俩同时都想用变量x,并且我俩都不想做出让步,此时我们不能因为这件事打一架吧,此时就可以用嵌套来解决这个问题,下面是代码示意图:

namespace wang
{
   namespace wang1
{
    int x = 12;
}
   namespace ming1
{
    int x = 13;
}
}

  4.最后说一下一个小的知识点,C嘎嘎的标准库都放到了一个叫做std的命名空间里,我们想要使用一些函数是就需要调用命名空间才能使用,那么如何对命名空间进行使用呢,不要着急,下面进入命名空间环节!

❀2.2.命名空间的使用

2.2.1.域作用限定符    " :: "

  我们已经知道了命名空间如何设定,那么我们如何去使用命名空间里面的数据呢?这里就需要用到一个操作符:域作用限定符:"::",它的作用类似于我们在使用结构体数据的时候的 . 操作符,是用来取命名空间里的数据的,下面小编就拿一段代码来让读者朋友知道这个符号的使用:

#include<stdio.h>
int x = 20;

namespace wang
{
	int x = 10;
}

int main()
{
	int x = 5;
	printf("%d", x);  //小编之前说过,编译器在查找数据的时候先找局部在找全局,并且小编在之前写C语言的文章说过:在使用同一变量的时候优先使用局部变量
	printf("%d", wang::x);  //  ::的左边放名字,右边放取的内容
	printf("%d", ::x);  //如果左边为空,则取出的是全局域的内容
}

  这个符号具体的使用小编在代码页已经解释清楚了,这里也重复一遍," :: "的左边放置域的名字,如果为空那么就是取出的是全局域的数据,也就是取出的是全局变量 ,这里可能会有一些读者朋友发话了:那么函数局部域的数据是否可以通过域作用限定符来进行取数据呢,很遗憾这是不可以的,这里跟函数局部域的生命周期有关,因为出了函数数据就会被销毁,所以此时我们不可以调用函数局部域的数据,那么使用命名空间的数据只有一种方法吗?当然是不可能的啦 ,小编目前所知命名空间的使用方法有两种,下面小编就开讲第二种方法:

2.2.2.第二种使用方法:用using展开所有成员(不推荐使用)

  正如标题所说,小编不怎么会去推荐这个方法来使用命名空间的数据,因为这个风险性很高的,我们先来说说用法,再来讲讲危害,下面用代码来代替文字:

namespace wang
{
	int x = 13;
}

using namespace wang;

int main()
{
	printf("%d", x);   //这里可以直接2使用
}

  通过using操作符,我们可以直接使用wang里面的所有数据,这样方便吗?方便。这样风险大吗?很大。我们使用命名空间的目的就是把名字隔离开,如果我们直接使用using,会直接把里面的内容全部展开,此时这里的x就相当于全局域的数据,很有可能再次出现名字冲突的危机,在我们写一些简单的算法题等等可以用它,可是等我们将来写项目的时候,我们如果用这个,真的就是埋了一颗定时炸弹,总有一天这个炸弹会在不经意间爆炸,那时候我们还得因为改数据而变得焦头烂额,所以这个方法能不用就不用,这里可能有些读者朋友会说,如果我们仅仅使用部分成员的话,这些数据常常使用并且不会造成什么危险的话,有办法实现吗?这是肯定的,小编现在讲述的第三种方法就是解决这个问题的,下面进入命名空间使用的第三种方法:

2.2.3.第三种使用办法:using展开部分成员

  这个方法算是比第二种方法好,但是远远比不上第一种方法安全,不过有时候也是很方便的,下面小编通过代码来展示一下这个方法的使用:

namespace wang
{
	int x = 20;
	int add(int a, int b)
	{
		return a + b;
	}
}

using wang::x;

int main()
{
	printf("%d", x);
}

  这里是仅仅把x = 20展开了,这里也用到了“ ::  ”操作符,可以理解为,先让wang把x内容展现出来,我们用using来去使用这个x,正如上文所说,对于一些我们常常使用到的命名空间里的数据,我们可以用这种方法来进行使用,但是安全系数还是不算太高的,所以总结来说,小编还是比较推荐第一种使用方法的,以上就是命名空间的使用方式,下面我们来正式进入C嘎嘎的代码的书写,开始了解C嘎嘎版本的打印和输入函数!

❀3.C嘎嘎的输入 && 输出 

  在开始正式内容之前,小编先提一嘴,C嘎嘎也是有头文件的,它的头文件是:iostream,是标准输入输出流库,在我们写代码的时候一定要记得它!不然我们就无法使用下面出现的函数,下面进入正式内容:

❀3.1.输出函数——cout

 3.1.1.cout函数的概念

  我们前面在学习C语言的时候,我们学到的输出函数是printf函数,C嘎嘎可以使用吗,答案是肯定的,C嘎嘎是在C的基础上实现的,自然也可以使用print函数,但我们C嘎嘎也有自己的输出函数,那就是 :cout函数!

  cout函数是我们在C嘎嘎常常用来执行输出,也就是打印操作的函数,它的printf更好的功能就是它不再需要%d,%f之类的占位符,它会自动识别变量的数据,这是小编认为优化比较好的功能,那么我们如何使用cout函数呢?别急,上面就是对cout函数的介绍,下面我们进入cout函数的使用环节!

 3.2.2.cout函数的使用

  这里面就要介绍一下一个不算船新的操作符:"<<",可能一些对于C语言颇有研究的读者朋友会说:这不就是C语言中的左移操作符吗?nonono,在C嘎嘎中,它可以是左移操作符,也可以是流插入运算符,这些都是靠情况而定的,它是搭配着cout进行使用的,在写代码之前,不知读者朋友是否还记得上面所说的std,这是一个标准库的命名空间,我们的cout函数和cin函数就存在里面,我们在使用之前一定要调用标准库,不然我们无法使用cout函数,下面展现一下cout函数到底如何去使用:

#include<iostream>
using namespace std;   //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候

//using std::cout;
//using std::cin;


int main()
{
	int x = 20;
	cout << x;  //小编给各位来个形象的比喻:我们可以把cout想成控制台,x是通过<<流向控制台,所以可以实现打印功能
	cout << "hello world";   //C是从hello world开始的,C嘎嘎也应该是从这里开始的!
	return 0;
}

  使用方法小编在上面讲述了,各位可以根据小编用的记忆法来知道cout函数的使用,我们在C阶段的时候,我们有时候需要换行操作,那个时候使用“ \n ”来实现的,那么我们在C嘎嘎也可以使用这个换行符吗?对于部分编译器这个是可以的,不过小编不太推荐使用这个方法,因为有些编译器它是不在接受这个换行符了,那么这个时候我们就又用到了一个函数,那就是endl函数,这个函数是专门来换行的,它的作用是:在流插入输出时,相当于插入了一个换行字符加刷新缓冲区,这是小编复制的一个官方的解释,读者朋友只要记住,它的作用就是换行,下面小编给出代码展示:  

#include<iostream>
using namespace std;   //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候

//using std::cout;
//using std::cin;


int main()
{
	int x = 20;
	cout << x << '\n';  //小编给各位来个形象的比喻:我们可以把cout想成控制台,x是通过<<流向控制台,所以可以实现打印功能
	cout << "hello world\n";   //C是从hello world开始的,C嘎嘎也应该是从这里开始的!
	//上面都是C语言时的换行写法,各位读者朋友少使用,下面的方法才是常使用的
	cout << x << endl;
	cout << "hello world" << endl;
	return 0;
}

  我们在C语言的学习过程中对于打印数据的时候,我们可以控制打印几位数,可以控制小数点后面的几位,那么cout函数可以实现这些功能吗?那当然是,不可以的,cout函数虽然方便但有些功能他就是实现不了,这个时候我们只能依靠printf函数来实现了,所以咱并不能说printf函数是一无是处的,它在某些方面还是蛮不错的,下面我们讲述完了输出函数,下面我们讲述输入函数喽!

❀3.2.输入函数——cin

3.2.1.cin函数的概念

  此时这里的cin函数就类似我们在C语言阶段学到的scanf函数,就是往控制台输入东西,然后在C阶段的时候我们配合着printf函数来进行在控制台打印数据的,只不过在C嘎嘎阶段我们是配合着cout函数来实现输入输出的,cin函数也比scanf函数好用许多,因为scanf函数我们需要用占位符以及用到变量的地址我们才可以打印数据,在cin函数这通通都不需要,下面小编来给各位讲述一下对于cin函数的使用

3.2.2.cin函数的使用

  对于cin函数的使用,这里我还要讲到一个操作符,可能已经有许多的读者朋友已经猜到了,那就是:“>>” 流提取运算符,这个可能也有读者朋友会说了,这不是C语言的右移操作符?确实在C语言是这样的,但现在是C嘎嘎,它也可以是流提取运算符,下面小编通过代码来给各位读者朋友了解cin函数的用法:

#include<iostream>


using namespace std;   //这个展开还是要少用,这里小编偷个懒就用了,各位可以用下面这种以后想使用cout,cin函数的时候

using std::cout;
using std::cin;



int main()
{
	int x = 0;
	cin >> x;  //这个可以想成从cin函数里面读取数据到x , 也是一种水的流动
	cout << x << endl;
	return 0;
}

  对于这个cin函数的理解方法,小编在上面的代码说明了,其实它和cout函数我们都可以记成水的流动,只不过方向不同罢了,一个是从数向控制台流动,一个是控制台向数流动,对于cin函数的使用,读者朋友要记住他的用法!看完cin函数和cout函数读者朋友是否感到:

  小编在学习的时候也是这么觉得很nice,在本节最后小编提醒一下读者朋友,其实cin,cout函数的对于算法题的运行效率不是太高,如果做到一些相关的算法题,可以加入下面的代码来进行改善。

int main() {
    在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
        可以提⾼C++ IO效率 ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return 0;
}

❀❀❀ 总结❀❀❀

  本来小编还想写多一点内容的,不过感觉文章篇幅有点长了,于是分成了两篇文章来进行书写,今天是小编学习C嘎嘎的第一天,已经对新语言的学习充满了期待,就像我当初学习C语言一样,如果文章有错误,恳请读者朋友在评论区指出,小编会吸取错误并进行改正,那么我们下篇文章见啦!

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

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

相关文章

零信任安全架构--最小权限原则

最小权限原则&#xff08;Principle of Least Privilege, PoLP&#xff09;是零信任安全架构中的核心理念之一&#xff0c;旨在确保用户、设备、应用等系统实体只拥有完成其任务所必需的最低权限&#xff0c;避免不必要的权限扩展&#xff0c;从而降低安全风险。 1. 概念 最小…

LabVIEW闪退

LabVIEW闪退或无法启动可能由多个原因引起&#xff0c;特别是在使用了一段时间后突然发生的问题。重启电脑后 LabVIEW 和所有 NI 软件都无法打开&#xff0c;甚至在卸载和重装时也没有反应。这种情况通常与系统环境、软件冲突或 NI 软件组件的损坏有关。 1. 检查系统和软件冲突…

Arthas dashboard(当前系统的实时数据面板)

文章目录 二、命令列表2.1 jvm相关命令2.1.1 dashboard&#xff08;当前系统的实时数据面板&#xff09; 二、命令列表 2.1 jvm相关命令 2.1.1 dashboard&#xff08;当前系统的实时数据面板&#xff09; 使用场景&#xff1a; 在 Arthas 中&#xff0c;dashboard 命令用于提…

echarts实现地图下钻并解决海南群岛显示缩略图

一、准备工作 1、echarts版本&#xff1a; ^5.5.1 2、去掉海南数据的json文件 二、获取删除过后的json文件 1、DataV.GeoAtlas地理小工具系列 (aliyun.com) 在网站输入这个复制的&#xff0c;新建一个json文件粘贴进去。 接下来需要删除两个地方&#xff0c;不要删错&…

前端vue-关于标签切换的实现

首先是循环&#xff0c;使用v-for“&#xff08;item,index) in list” :key“item.id” 然后当点击哪个的时候再切换&#xff0c;使用v-bind:class" "或者是:class" ",如果都是用active的话&#xff0c;那么每一个标签都是被选中的状态&#xff0c;…

[C高手编程] C语言宏、内置宏与预处理:深入理解与应用

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;C高手编程-面试宝典/技术手册/高手进阶⚡️⚡️&#x1f496;&#x1f496; 「C高手编程」专栏融合了作者十多年的C语言开发经验&#xff0c;汇集了从基础到进阶的关键知识点&#xff0c;是不可多得的知识宝典。如果你是即将…

TypeScript异常处理

1.异常的概念 程序运行中意外发生的情况就成为异常 例子&#xff1a; //除法运算function chu(num1:number,num2:number){if(num20){//throw 抛出异常throw new Error(除数不能为零)}let num:numbernum1/num2console.log(num) }//程序出现异常后会停止运行// 捕获异常try{ /…

《黑神话悟空》开发框架与战斗系统解析

本文主要围绕《黑神话悟空》的开发框架与战斗系统解析展开 主要内容 《黑神话悟空》采用的技术栈 《黑神话悟空》战斗系统的实现方式 四种攻击模式 连招系统的创建 如何实现高扩展性的战斗系统 包括角色属性系统、技能配置文件和逻辑节点的抽象等关键技术点 版权声明 本…

【他山之石】Humanize AI 简介

Humanize AI 简介 Humanize AI 官方首页截图 文章目录 Humanize AI 简介1 Humanize AI 是什么2 Humanize AI 能做什么3 Humanize AI 怎么用4 Humanize AI 怎么收费5 结论 1 Humanize AI 是什么 数字时代的当下&#xff0c;AI 人工智能已成为内容创作不可或缺的一部分。从生成文…

poi-tl的详细教程(动态表格、单元格合并)

前提了解poi-tl 链接: springboot整合poi-tl 创建word模板 实现效果 代码实现 ServerTableData import com.deepoove.poi.data.RowRenderData;import java.util.List;public class ServerTableData {/*** 携带表格中真实数据*/private List<RowRenderData> serverDat…

【Python常用模块】_PyMySQL模块详解

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…

window.open()地址栏隐藏问题解决方案

问题 使用window.open打开一个页面时&#xff0c;想要隐藏地址栏&#xff0c;但是无效。 window.open (test.html,newwindow,height100,width400,top0,left0,toolbarno,menubarno,scrollbarsno, resizableno,locationno, statusno)由于浏览器区别和安全问题&#xff0c;浏览器…

最新动态一致的文生视频大模型FancyVideo部署

FancyVideo是一个由360AI团队和中山大学联合开发并开源的视频生成模型。 FancyVideo的创新之处在于它能够实现帧特定的文本指导&#xff0c;使得生成的视频既动态又具有一致性。 FancyVideo模型通过精心设计的跨帧文本引导模块&#xff08;Cross-frame Textual Guidance Modu…

数据结构里的栈和队列

栈的笑话 程序员A对程序员B说&#xff1a;“你知道为什么程序员喜欢栈吗&#xff1f;” 程序员B疑惑地问&#xff1a;“为什么&#xff1f;” 程序员A回答&#xff1a;“因为它没有bug&#xff08;bug的谐音在英语中也是‘虫子’的意思&#xff0c;而栈的英文是stack&#x…

Elasticsearch:一次生产集群 ES Watcher 失效的深度排查与分析 - 全过程剖析与解决方案

作者&#xff1a;尚雷&#xff0c;TechTalk 技术交流社区创办者 一次生产集群 ES Watcher 失效的深度排查与分析 全过程剖析与解决方案​​ 一、Elasticsearch Watcher 介绍 1.1 Watcher 概念概述 Watcher 是 Elasticsearch 提供的一项监控和告警服务&#xff0c;允许用户定义…

Mybatis 快速入门(maven)

文章目录 需求建表新建了数据库但是navicat界面没有显示 新建maven项目 注意导入依赖 总结 黑马学习笔记 需求 建表 注意&#xff1a;设置字符集 减少出错 drop database mybatis; create database mybatis charset utf8; use mybatis;drop table if exists tb_user;create…

【IDEA】自定义注解

1.给Java类加上注解 包含一个代码片段&#xff0c;可以在 #parse 指令的帮助下将其包含在 文件模板&#xff08;Templates 标签页&#xff09;中。 此内置模板是可编辑的。 除了静态文本、代码和注释外&#xff0c;您还可以使用预定义变量&#xff0c;这些变量随后将像宏一样被…

Android 如何实现搜索功能:本地搜索?数据模型如何设计?数据如何展示和保存?

目录 效果图为什么需要搜索功能如何设计搜索本地的功能&#xff0c;如何维护呢&#xff1f;总结 一、效果图 二、为什么需要搜索功能 找一个选项&#xff0c;需要花非常多的时间&#xff0c;并且每次都需要指导客户在哪里&#xff0c;现在只要让他们搜索一下就可以。这也是模…

react hooks--useMemo

概述 相当于计算属性!!! useMemo实际的目的也是为了进行性能的优化。 ◼ 如何进行性能的优化呢&#xff1f;  useMemo返回的也是一个 memoized&#xff08;记忆的&#xff09; 值&#xff1b;  在依赖不变的情况下&#xff0c;多次定义的时候&#xff0c;返回的值是相同…

HarmonyOS Next开发----使用XComponent自定义绘制

XComponent组件作为一种绘制组件&#xff0c;通常用于满足用户复杂的自定义绘制需求&#xff0c;其主要有两种类型"surface和component。对于surface类型可以将相关数据传入XComponent单独拥有的NativeWindow来渲染画面。 由于上层UI是采用arkTS开发&#xff0c;那么想要…