C++入门(前篇)

news2025/1/12 8:39:05

🔥🔥本章重内容
在这里插入图片描述

C++入门

  • 1.命名空间
  • 2. C++输入&输出
  • 3. 缺省参数

简单的说一下C++语言的出现是为了弥补C语言的不足
由于要补充的东西太多,所以就在C语言的基础上又出了C++
所以我认为学习C++的前提是你得懂C语言
C++中可以使用C的大部分语法
可以这样理解在这里插入图片描述
C++关键字:学习过C语言的同学们都知道关键字这个东西只有用了才能学的会,光靠讲它的作用,大家肯定也是一脸蒙。所以C++的关键字我这里就不作讲解了。

1.命名空间

先来看一段C代码

#include <stdio.h>

//全局变量
int a = 0;

int main()
{
	//局部变量
	int a = 1;
	printf("%d\n", a);

	return 0;
}

毋庸置疑这里会输出结果为: 1
那我们如果想要输出全局变量有没有办法呢?
答:C语言不可以,但C++有办法
C++代码如下

#include <iostream>
using namespace std;

int a = 0;

int main()
{
	int a = 1;
	printf("局部变量:%d\n", a);
	printf("全局变量:%d\n", ::a);
	return 0;
}

这个符号 :: 为作用域限定符。
变量名前单加一个 :: 意为全局变量
其实命名空间的主要作用是,防止变量、函数和类重命名
看如下代码:

#include <stdio.h>
#include <stdlib.h>

int rand = 0;

int main()
{
	printf("%d\n", rand);
	return 0;
}

又是C代码?没错我们的C++是兼容C的大部分语法的。
我们在全局变量中定义了一个rand变量,再在main函数中打印,看似没有什么毛病,实际上程序会报错。
因为<stdlib.h>中有个函数的名字也叫rand,可以生成随机数。
报错如下:
在这里插入图片描述
因为在正真的开发过程中是由很多的程序员一起来完成的,他们每个人都有自己要完成的任务,各自写代码时不知道别人的怎么命名的所以就有了namespace(命名空间),namespace关键字的出现就是针对这种问题的。

#include <iostream>
using namespace std;

namespace cx
{
	int a = 2;
}

int a = 0;

int main()
{
	int a = 1;
	printf("局部变量:%d\n", a);
	printf("全局变量:%d\n", ::a);
	printf("自定义命名空间变量:%d\n", cx::a);
	return 0;
}

在这里插入图片描述
注意一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
要访问命名空间中的变量只需要,命名空间名::变量名就可以了

namespace cx
{
	// 命名空间中可以定义变量/函数/类型
	int a = 5;
	int Add(int left, int right)
	{
		return left + right;
	}

	struct stu
	{
		char name;
		int age;
	};
}

在C++标准库里的东西,都在std里面。
比如刚刚我们c语言,不可以使用的rand在C++中就可以使用
在这里插入图片描述

namespace std
{
	//库里面的东西
}

要想使用C++库里面的函数就得加上它的空间名::
或者用using将空间域展开

//展开std中的所有东西
using namespace std;
//部分展开,展开个别
using std:: cout;
using std:: endl;

虽然可以全局展开但我们最好不要这样做,因为我们有时会不小心与库里面的函数、变量重名。只要局部展开一些常用的即可。

那大家看一下我们下面这段代码可以这样写吗?

namespace cx
{
	int a = 2;
}

int a = 3;

using cx::a;

答案是:不可以
当我们把我们定义的域展开了之后它就会与,全局变量里的冲突。
报错如下:
在这里插入图片描述

2. C++输入&输出

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
    以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
    iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型
#include <iostream>
#include <string>
//在平时自己练习的时候可以展开全局
using namespace std;

//写项目时要局部展开
//using std::cout;
//using std::cin;
//using std::endl;

int main()
{
	int a = 5;
	const char* arr = "abcde";
	//endl 等价于 '\n'
	cout << a << endl;
	cin >> a;
	cout << a << endl;
	cout << arr << endl;

	return 0;
}

在这里插入图片描述

3. 缺省参数

像这样在参数部分赋值的叫做缺省参数。

void Fun(int a = 5)
{
	cout << a <<endl;
}

那它的作用是什么呢?
答:如果我们调用该函数,没有传参,那么a就等于5
如果我们传了参数,那a就等于我们所传的参数

#include <iostream>
#include <string>
using namespace std;

void Fun(int a = 0)
{
	cout << a <<endl;
}

int main()
{
	int a = 5;
	//传递参数
	Fun(a);
	//没有传参
	Fun();
	return 0;
}

在这里插入图片描述
全缺省参数

void Func(int a = 10, int b = 20, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

半缺省参数

void Func(int a, int b = 10, int c = 20)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

那缺省参数可以像下图这样吗?

void Func(int a = 10, int b, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

int main()
{
	Func(3,4,5);
	return 0;
}

答案是不可以的
在这里插入图片描述
所以半缺省参数必须从右往左依次来给出,不能间隔着给。
那我们在些项目的时候,缺省参数是在含的声明是给呢,还是在函数的定义时给呢,还是两个都给缺省参数呢?
由下图代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大家觉得这样写可以吗?运行一下看结果。
在这里插入图片描述
图片中报错了,说是我们重定义了默认参数。
说明这样写是不可以的。

那我们把函数声明时的缺省参数去掉,观察一下结果。
在这里插入图片描述
结果正确。
那我们再把定义时的缺省参数去掉。
在这里插入图片描述
结果也是可以的。

上面我们时fun(1,2,3)赋值了如果不赋值呢?
在这里插入图片描述
我们先把声明时的缺省参数去掉,参看程序是否可以正常运行。
在这里插入图片描述
报错了,这是为什么呢?

知识补充
实际程序在运行期间是不会去运行头文件的,但头文件会在每个文件中展开相当于
在这里插入图片描述
所以把声明的部分引进来,在调用函数Func,发现我们声明的部分没有缺省参数,我们也没有传值,编译器就会报错。
所以我们最好在声明是给缺省参数
总结:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现,但最好在声明时给
  3. 缺省值必须是常量或者全局变量

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

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

相关文章

Autowired注解与Resource注解的区别

两者的用法 其实这两个注解的作用都一样,都是在做bean的注入,在使用过程中,两个注解有时候可以替换使用 两者的共同点 Resource注解和Autowired注解都可以用作bean的注入.在接口只有一个实现类的时候,两个注解可以互相替换,效果相同. 两者的不同点 Resource注解是Java自身的…

技术分享 | OceanBase 手滑误删了数据文件怎么办

作者&#xff1a;张乾 外星人2号&#xff0c;现兼任六位喵星人的资深铲屎官。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 手滑误删了数据文件&#xff0c;并且没有可替换的节点时&…

代码随想录第19天 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先 var lowestCommonAncestor function(root, p, q) {// 使用递归的方法// 1. 使用给定的递归函数lowestCommonAncestor// 2. 确定递归终止条件if(root null) {return root;}if(root.val > p.val && root.val > q.val) {// 向左子…

set、map容器

一、set 1. set基本概念 简介: 所有元素都会在插入时自动被排序 本质: set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。 set和multiset区别: set不允许容器中有重复的元素 multiset允许容器中有重复的元素 2. set构造和赋值 构造: set<T> st; …

安装WMware16、centos7记录

将一台闲置电脑安装虚拟机&#xff0c;计划给个8G内存&#xff0c;80G硬盘&#xff0c;打算安装WMware16&#xff0c;对系统要求是win10 一、将win7升级到win10 1.1、正版的win10安装U盘制作教程 https://www.bilibili.com/video/BV1AW411G7Lq/?vd_sourcecaf04463d06774efd…

Okio 网络提速

文章目录网络数据处理流程Page Cache传统 I/O 拷贝的性能问题零拷贝技术DMA 技术零拷贝技术分类mmapsendfilespliceDirect I/O零拷贝技术性能分析小结OkioOkio 的使用Okio 网络提速的原理Okio 总结总结网络数据处理流程 在讲 Okio 之前&#xff0c;为了能更好的了解 Okio 的优…

如何制定项目里程碑 它的作用体现在哪

制定项目里程碑是项目管理中的一个重要步骤&#xff0c;它可以帮助团队确立项目目标、分解任务、评估风险、规划资源和监控进度。在这篇文章中&#xff0c;我们将介绍如何制定项目里程碑和它的作用。 如何制定项目里程碑 制定项目里程碑需要遵循以下步骤&#xff1a; 1、确定…

《程序员面试金典(第6版)》面试题 10.01. 合并排序的数组

题目描述 给定两个排序后的数组 A 和 B&#xff0c;其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法&#xff0c;将 B 合并入 A 并排序。 初始化 A 和 B 的元素数量分别为 m 和 n。 示例: 输入: A [1,2,3,0,0,0], m 3 B [2,5,6], n 3 输出: [1,2,2,3,5,6] 说明: …

简单六步,帮助HR高效管理零工

AIHR发布的《2023人力资源趋势》中提到&#xff0c;过去HR往往只关注全职员工&#xff0c;忽略了其他劳动力生态系统成员&#xff0c;比如零工、外包员工和临时工等&#xff0c;而如今这些劳动力生态系统的成员在公司的服务交付中发挥着越来越重要的作用。△ 传统劳动力生态系统…

Java入坑之集合、流与序列化

一、集合 1.1集合定义 集合概念&#xff1a; 保存和盛装数据的容器&#xff0c;将许多元素组合成一个单一单元的容器对象。集合&#xff0c;可用于存储/检索/操作/传输/聚合数据集合框架&#xff1a; 表示和操作集合的体系&#xff0c;包括接口、实现类&#xff0c;集合框架的…

【Nav2】Ubuntu18+ROS2 Eloquent跑通Navigation2仿真示例

【背景】 打算通过Navigation2来了解ROS2的核心两大件——LifeCircle和BehaviorTree&#xff0c;结果根据官网的教程一顿鼓捣&#xff0c;这个Turtlbot3的仿真就是跑不起来&#xff0c;这怎么能忍&#xff1f;虽然在Ubuntu20上使用Foxy版本可以非常容易就跑通demo&#xff0c;…

3年外包终上岸,我只能说:但凡有点机会,千万别去外包...

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司的软件测试岗&#xff0c;一干就是3年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&am…

behaviac —— Win10下Vs2017编译“腾讯行为树“源码

简介 - 腾讯行为树 behaviac是游戏AI的开发框架组件,也是游戏原型的快速设计工具。支持全平台,适用于客户端和服务器,助力游戏快速迭代开发 。编辑器可以运行在PC上,操作方便直观可靠,支持实时和离线调试;编辑器可以导出xml,bson等多种格式,更可以导出C++、C#源码,提供…

免费1年服务器,部署个ChatGPT专属网页版

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 白皮袄个免费1年服务器&#xff0c;部署个ChatGPT专属网页版&#xff01; api.openai.com port 443: Connection timed out 你是…

Spring Security --- 基于内存模型创建用户角色

授权实现方式 基于内存模型实现授权基于默认数据库模型实现授权基于自定义数据库模型实现授权 基于内存模型创建用户角色 在Spring Security4.x版本中&#xff0c;登陆的用户有一个默认的ROLE_USER角色但是在Spring Security5.x版本中&#xff0c;把这个默认的角色给去掉了需要…

推荐一个3D建模工具集

3D建模工具集, 收录一下几个工具集&#xff1a;数字孪生编辑器 基于WebGL技术&#xff0c;依托丰富的模型资产库&#xff0c;通过拖拽式的操作&#xff0c;方便用户高效便捷的搭建三维数字孪生场景&#xff0c;配合twin服务平台&#xff0c;实现孪生设备姿态控制的虚实…

2023年第十四届蓝桥杯 C++ B组参赛经历和总结

2023年第十四届蓝桥杯 C B组参赛经历和总结 目录2023年第十四届蓝桥杯 C B组参赛经历和总结前言走上算法之路备考备战之路蓝桥杯比赛过程感受总结值不值得打备赛建议前言 写这篇博客的缘故&#xff0c;因为看到好几篇记录自己蓝桥杯经历的博客&#xff0c;于是乎我也想写一篇&…

【论文精读】Arxiv 2023 - Segment Anything

【论文精读】Arxiv 2023 - 分割一切 【论文原文】&#xff1a;Segment Anything 【作者信息】&#xff1a;Kirillov, Alexander and Mintun, Eric and Ravi, Nikhila and Mao, Hanzi and Rolland, Chloe and Gustafson, Laura and Xiao, Tete and Whitehead, Spencer and Ber…

如何设计帮助中心才能真正地帮助客户解决问题?

对于当今如此智能的时代&#xff0c;大多数人都习惯性地自己解决问题&#xff0c;所以在浏览某个网站或是使用某个产品遇到问题时&#xff0c;第一反应不再是找客服&#xff0c;而是到帮助中心去寻找解决问题的办法&#xff0c;因此&#xff0c;帮助中心变得越来越重要了。 那…

c# wpf log 调试 输出窗口

需求 刚好需要新手入门开发一个WPF界面&#xff0c;所以需要一些日志输出 其实我们只是简单的入门调试&#xff0c;只需要很简单的输出 真不需要log4net, expression等等比较长期地&#xff0c;跨度比较大的日志系统 而且这些日志系统接入也比较麻烦 有没办法做一个简单的…