首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++ 核心语法入门:输入输出、缺省参数与重载

C++ 核心语法入门:输入输出、缺省参数与重载

作者头像
云泽808
发布2025-12-30 17:49:06
发布2025-12-30 17:49:06
880
举报
在这篇文章开始之前,我想给大家推荐一个非常牛的人工智能学习网站。在近几年,大家也知道人工智能和 AI 技术的发展也是非常迅速,越来越多的高校也纷纷一引入了相关课程,将其纳入教学体系。所以面对这样的趋势,提前掌握一些 AI 知识,必定能为未来的职业发展增加竞争力。 人工智能学习网站

一、C++的第一个程序

C++兼容C语言绝大多数的语法,所以C语言实现的hello world依旧可以运行,C++中需要把定义文件的代码后缀改为.cpp,VS编译器看到是.cpp就会调用C++编译器编译,linux下要用g++编译,不再是gcc

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当然C++有一套自己的输入输出,C++版本的hello world是下面这么写的

在这里插入图片描述
在这里插入图片描述

二、命名空间

2.1 namespace的价值

C语言的第一个不足就叫命名冲突

在这里插入图片描述
在这里插入图片描述

编译的时候,预处理阶段头文件会展开,没包含头文件#include<stdlib.h>的时候只有一个变量rand,包含了它之后,头文件内还有一个叫rand的函数,下面打印的时候编译器就不知道使用的是哪个rand了

虽然这里稍微改一下变量名就可以正常输出了,而在一个公司内部,一个项目多达几百w行代码,而这么多的代码量肯定是由很多人写的,这样的情况下两个人起的名字冲突概率还是很大的,于是就出现了命名空间来解决这个问题

2.2 namespace的定义

  • 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等
  • namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不再冲突了

C/C++对命名定义的规定是在同一作用域下,不能定义同名变量,反之

这里用printf访问a,会优先访问局部域的a,这是因为局部优先原则

在这里插入图片描述
在这里插入图片描述

如果这里想要访问全局的a,就要使用::运算符(域作用限定符号)了,有了它就可以指定访问作用域了,如果域作用限定符左边没东西,默认的就是全局

而想要访问命名空间里的rand,就要在域作用限定符左边加上域的名字

在这里插入图片描述
在这里插入图片描述

这里报错的原因是,第三个printf默认访问了全局的rand,rand是个函数名,是个指针,而指针要用%p打印,把%d改为%p即可

且其不会默认的从局部到全局再到命名空间去搜索,在没有指定的情况下,默认是不会去命名空间中进行搜索的

在这里插入图片描述
在这里插入图片描述

所以总结下来就是:编译器语法查找确认,默认先局部查找,再全局查找,找不到就报错。 如果制定了作用域,就直接去这个域查找,没有找到就报错

如果想用命名空间里的类型去定义一个变量,是定义不了的,想定义bit要加在Node前面,因为主体定义的是Node

在这里插入图片描述
在这里插入图片描述
  • C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的声明周期(如局部域和全局域),命名空间域和类域不影响变量声明周期,命名空间没有结束的概念,所以命名空间域的生命周期依旧是全局(从main函数开始到main函数结束),即命名空间里定义的变量可以理解为全局变量
  • namespace只能定义在全局,当然他还可以嵌套定义 在一个公司做一个比较大的项目的时候,一个项目会分为几个不同的组,为了防止组和组冲突,通常会定义不同的命名空间,相关组就把自己组的代码放入相关的命名空间
在这里插入图片描述
在这里插入图片描述

但是如果数据库组的业务量很大,有10个人负责这一部分的代码,那他们之间也可能有命名冲突的问题,所以就可以嵌套命名空间。如果命名空间也冲突了,那只有改名字了,不过这样相比C语言那样的全局命名冲突的概率就小很多了

在这里插入图片描述
在这里插入图片描述

上面的情况都是在同一个文件下,但是在实战中,一个项目的代码都是在很多个文件里的,下面看一下多文件情况下的冲突问题

  • 项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突

如图现在这些数据结构命名冲突了

stack.h

在这里插入图片描述
在这里插入图片描述

Queue.h

在这里插入图片描述
在这里插入图片描述

也就是在声明和定义分离的时候,虽然Queue.h和Queue.cpp里的命名空间在不同文件里,但是会合并成一个

所以说之前的数据结构的文章内我都带了名词前缀,在这样的情况下就不需要带名词前缀了,直接使用命名空间就可以了

Queue.h

在这里插入图片描述
在这里插入图片描述

Stack.h

在这里插入图片描述
在这里插入图片描述

Queue.cpp

在这里插入图片描述
在这里插入图片描述

Stack.cpp

在这里插入图片描述
在这里插入图片描述

test.c

在这里插入图片描述
在这里插入图片描述

可以看到也是可以正常跑起来的

  • C++标准库都放在一个叫std(standard)的命名空间中

这里举个例子,现在要使用C++的排序,就包含图中的头文件,这个头文件就叫算法,下图的算法sort底层就是快排,直接在参数传数组开始的地址,和结束的地址(结束的地址不是7,而是最后一个数据的下一个位置)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样也有一个防止命名冲突的效果

2.3 命名空间使用

编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。一般使用命名空间中定义的变量/函数,有三种方式:

  • 指定命名空间访问,项目中推荐这种方式
  • 展开命名空间中全部成员(暴漏到全局),项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用

可以认为using namespace std这里的std是展开库里面std的命名空间,之后用库里面的东西就不需要指定了

在这里插入图片描述
在这里插入图片描述

比如说< iostream >里的东西是用namespace std包含起来的,using namespace std就相当于头文件里包含的东西就到全局了。这里默认找cout是从局部和全局查找,加了using namespace std的意思就是,如果现在局部全局都没找到cout,还会到展开的命名空间中去查找

  • 前面两种方式要么挨个去指定,要么一把全展开了,这个就是一个折中的方式了。using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。 如果说一个项目之中,cin和sort用的比较少,但是cout和endl用的很多,每次加std很麻烦,就可以使用这样的部分展开的方式
在这里插入图片描述
在这里插入图片描述

意思就是cin和sort直接去std中去寻找,而cout和endl就相当于直接暴漏在全局了

在这里插入图片描述
在这里插入图片描述

不过少部分常用的全部展开之后,自然就不能定义和展开同名的东西了


四、C++输入&输出

  • < iostream >是Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象
  • std::cin是iostream类的对象,它主要面向窄字符串(一个字节的字符)的标准输入流(黑框框输入的任何东西都可以认为是字符串,cin就是从字符串转换为对应的类型,但是匹配不上就会报错)
  • std::cout是iostream类的对象,它主要面向窄字符串的标准输出流。 补充一下,输出就是把任何类型的对象,都转换成窄字符的串输出,本质上就是都转换成字符串输出到控制台(黑框框)去
  • <<是流插入运算符,>>是流提取运算符(<</>>在与整形接触的时候和C语言一样,依旧左移和右移,但是和cout,cin配合的时候,就变成了流插入流提取
  • std::endl是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区(\n与endl的区别是刷新缓冲区,频繁的刷新缓冲区会影响一个效率问题,但刷新缓冲区也可以把endl前面写的东西及时的输出出去,而\n则是会累积,把东西都放到一个缓存,再刷到对应的地方。在算法竞赛中还是建议使用\n,效率更高)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如图本质上没有匹配上,就相当于报错了

  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质上是通过函数重载实现的,后面的文章会写),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出
  • cout/cin/endl等都属于C++标准库,C++标准库都放在一个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们呢
  • 而且C++即使没有包含< stdio.h >,也可以使用printf和scanf,在包含 < iostream >间接包含了。VS系列编译器是这样的,其他编译器可能会报错(如gcc)

补充一下,在用C++打ACM/蓝桥杯一些竞赛的时候,输入输出在前面的时候会加下面几行代码可以提效率

代码语言:javascript
复制
#include<iostream>
using namespace std;

int main()
{
	//在IO需求比较高的地方,如部分大量输入的竞赛中,加上以下3行代码
	//可以提高C++IO效率
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	return 0;
}

因为OJ分为两种,一种是IO型一种是接口型

  1. 在力扣上刷题主要就是接口型,用户直接实现一个给好的函数就可以了,其测试用例是通过参数传过来的,结果通常用返回值进行返回,提交之后会通过网络和后台的程序进行合并,另一边就是头文件和main函数
  2. 另一种就是IO型,要编写所有代码。一般情况下cout和cin的效率是没有printf高的。此时就有了两种解决办法,第一种就是继续使用printf和scanf,另一种就是加这几行代码。 加了之后就可以把cout和printf混着写了,会保证顺序,但是会降低一些效率(相当于让C++和C同步了),不加的话还是分开写,这一部分后面的文章我还会写

五、缺省参数

  • 缺省参数是声明和定义函数时为函数的参数指定一个缺省值(一般是常量值,也可以是全局变量)。在调用该函数时,如果没有指定实参,则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数(有些地方把缺省参数也叫默认参数)
在这里插入图片描述
在这里插入图片描述
  • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右向左一次连续缺省,不能间隔跳跃给缺省值(也就是给缺省值也不能跳跃,传参也不能跳跃)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里语法编译就无法通过

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  • 带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
在这里插入图片描述
在这里插入图片描述
  • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个程序在没有缺省参数的情况下是设计的不够好的,比如说初始化的时候,n很大的时候就需要不断扩容,这就需要性能的消耗(扩容需要开空间,拷贝,释放旧空间)

此时就需要对SLInit函数进行改造,增加一个参数n,这样初始化就可以开辟n个数据大小的空间,控制顺序表初始化的大小,这样就起到一个优化的作用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还有一种情况,当不知道插入多少数据,就可以使用缺省参数,默认开4个数据大小的空间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还有一种情况,比如说这里顺序表中要查找数组中所有的4

代码语言:javascript
复制
5 4 6 3 4 7 4

按照之前的顺序表只能查找出第一个4的下标 这个解决方法用半缺省就可以了 加了一个半缺省之后,就不是每次都从0位置开始查找了,这里就每次都从i位置开始查找,没有找到return -1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样默认想从0位置查找,就可以不传i这个参数


六、函数重载

C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的

在这里插入图片描述
在这里插入图片描述

C++可以通过参数匹配去自动识别,所以C++比C写的更爽

在这里插入图片描述
在这里插入图片描述

接下来两种情况函数重载就有问题了

  1. 返回值不同不能作为重载条件,因为调用时也无法区分
  2. 无参数和全缺省可以构成构成函数重载,传参的话去调用第二个f1没有问题,但是不传参的时候就无法确定调用谁了,还是会报错

总结

本来C++的基础语法准备用一篇文章写完的,结果发现细节太多了,相比C的细节翻了一倍,干脆分两篇来写了,喜欢博主的文章不要忘记一件三联支持一下哦~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在这篇文章开始之前,我想给大家推荐一个非常牛的人工智能学习网站。在近几年,大家也知道人工智能和 AI 技术的发展也是非常迅速,越来越多的高校也纷纷一引入了相关课程,将其纳入教学体系。所以面对这样的趋势,提前掌握一些 AI 知识,必定能为未来的职业发展增加竞争力。 人工智能学习网站
  • 一、C++的第一个程序
  • 二、命名空间
    • 2.1 namespace的价值
    • 2.2 namespace的定义
    • 2.3 命名空间使用
  • 四、C++输入&输出
  • 五、缺省参数
  • 六、函数重载
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档