【C++】C++入门基础详解(1)

news2024/12/24 10:05:21

本篇内容要分享的是C++的基础内容,C++的诞生简单的说就是为了填补C语言中的语法坑,同时对比C语言来说增添很多便捷的语法规则,使用起来比C语言便捷不少,但是学习难度也大大增强,不过难度是成线性增长,可以一步一步的深入学习。

目录

1.命名空间

1.1命名空间指定使用

1.2命名空间全部展开

1.3命名空间部分展开

1.4命名空间嵌套

1.5命名空间自动合并

2.关于cout和endl

3.缺省参数

3.1缺省参数简单使用

3.2全缺省参数

3.3半缺省参数

 4.函数重载


关于C++的历史本篇不过多分享,有兴趣的可以自行去了解,接下来就直接从代码开始。

首先我们要庆贺的是我们使用VS创建文件时不用再创建.c文件了,可以直接创建.cpp文件

 我们都知道.c文件是我们学习C语言所要创建的,而.cpp文件则是C++学习时所要创建的文件,因为C++的语法包含了C语言,所以当时在学C语言时可能不会注意文件的后缀,不过现在既然要学习就要秉着严谨的态度来认识这些细节。

当初我们刚刚接触C语言时敲出的第一段代码就是打印hello world

 那现在开始接触C++我们同样的也从打印hello world开始,下面是C++打印hello world

可以看到频幕上就打印出了hello world;

这就是C++入门需要重点学习的地方:命名空间和io流

C++的很多语法规则都是在填C语言所留下的坑,也就是C语言设计上不合理的地方,所以我们不妨对比着C语言来解释以上C++代码的含义;

1.命名空间

如下C语言代码

 可以看到这里定义了整形rand,并且可以顺利将其打印出来,但是如果我们做一点手脚

 可以看到我们包含了一个stdlib的头文件就不能打印了,这就是C语言的缺陷。

1.1命名空间指定使用

C语言中面临着命名冲突的问题,因为在stdlib这个头文件中同样含有名为rand的函数,在C语言中面对这样的情况我们只能将自己定义的rand改成其他名字, 在工作中如果同组的同事和你用了同样的变量名,那你们只能决定谁来修改命名。

但是在C++更新了一种用法,就是命名空间,用法如下

 我们可以使用 namespace+命名 来创建命名空间,将头文件中的全局变量和自己定义的变量隔离起来,这样就不会出现命名冲突的问题,同样的,需要访问命名空间中的数据时,需要如上图使用空间名::来进行访问,否则访问的会是全局变量,所以在C++中有一个新的符号:域作用限定符::

其实可以抽象的将命名空间理解为广场上的一个小房子,需要访问命名空间里的变量、函数或者结构需要使用作用域限定符来访问,就像小房子的钥匙 

在简单了解命名空间的使用方法之后再来看看他的其他玩法

namespace wdd
{
	int rand = 0;
	int Add(int x, int y)
	{
		return x + y;
	}

	struct  wdd
	{
		struct Node* next;
		int val;
	};
}
int main()
{
    struct wdd::Node node;
	printf("%d \n", wdd::rand);
	printf("%d \n", wdd::Add(1,2));
	return 0;
}

如上代码所示,其实命名空间内还可以包含很多东西,需要访问命名空间里的数据就需要"钥匙"来进行访问,同时也要注意结构体类型的定义方法。

我们同时在命名空间内同时定义了Add函数

namespace wdd
{
	int rand = 0;
	int Add(int x, int y)
	{
		return x + y;
	}
}

int Add(int x, int y)
{
	return (x + y)*10;
}
int main()
{
	printf("%d \n", wdd::rand);
	printf("%d \n", wdd::Add(1,2));
	printf("%d \n", Add(1, 2));
	return 0;
}

 

可以看到没有通过域作用限定符操作的函数就会调用全局变量的Add函数。

1.2命名空间全部展开

向上面那样使用一次就要通过域作用符操作一次稍嫌麻烦,有没有更加便捷的方法呢?

我们可以直接将作用域展开,情况如下

 我们可以直接在命名空间外使用using namespace+空间名即可将对应的空间名全部展开

这样的操作就意味着将广场上的小房子拆除掉,小房子中所有的资源都会成为公有,所以展开命名空间的操作很危险。

展开命名空间之后可以看到rand已经出现错误了,因为不知道调用的是头文件中的rand还是命名空间中的rand。

1.3命名空间部分展开

还有一种是用环境就是我们想要多次的调用命名空间里的函数或者变量,那还有一种方法如下

 

在使用的时候指定展开命名空间里的函数或其他数据,就可以直接调用里面的函数,我们称之为部分展开。

1.4命名空间嵌套

命名空间同样也可以嵌套使用如下代码

namespace wdd
{
	int rand = 0;
	int Add(int x, int y)
	{
		return x + y;
	}

	struct  wdd
	{
		struct Node* next;
		int val;
	};
	namespace zmj
	{
		int rand = 1;
	}
	
}
int main()
{
	printf("%d \n", wdd::zmj::rand);
}

运行结果如图

 这就是命名空间嵌套使用。

那我们再回过头来看用C++打印hello world的那段代码

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

很明显using namespace std就是展开std这个命名空间,std是C++标准库的命名空间,为了防止和自己定义的变量名称产生冲突。

那同样的只有展开了std才能使用cout,我们也可以采用如下几种方法使用cout

1.部分展开

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

2.指定展开

#include<iostream>

int main()
{
	std::cout << "hello world " << std::endl;
	return 0;
}

通过以上学习我们就可以使用这几种方法来展开std打印hello world。

1.5命名空间自动合并

如果我们定义了同名的命名空间,编译器就会自动将同名的命名空间合并,如下列

 可以看到在两个不同的头文件里定义了相同名的命名空间,也就是说多个命名相同的命名空间并不会冲突。

2.关于cout和endl

因为cout和endl详细实现是有关于类和对象的,所以这里简单介绍一下他们的使用即可;

在cout和endl中,cout 的c是console的意思,也就是控制台的意思,那么cout就是在控制台输出的意思,也就是打印出来的黑框。endl就是换行的意思,和\n的用处相同

cout << "hello world" << endl;

而<<符号是流插入输入符,那上面代码的意思很形象的就是hello world流向cout输出;

那同样,有插入就有提取,>>就被称为流提取通常与cin使用

int i=0; 
std::cin>>i;

 这里的意思就是输入i。

这里重要的是cout和cin可以自动识别类型,这是printf和scanf做不到的;

#include<iostream>
using namespace std;

int main()
{
	int i = 0;
	double j = 0;

	cin >> i >> j;

	cout << i << endl;
	cout << j << endl;
	return 0;
}

 可以看到测试出来i和j是可以自动识别类型的

3.缺省参数

3.1缺省参数简单使用

直接上代码讲解语法规则

#include<iostream>
using namespace std;
void Func(int a = 1)
{
	cout << a << endl;
}

int main()
{
	Func(2);
	Func();
}

缺省参数就是以在定义函数参数的时候加上缺省值,如上代码可以看到在定义函数时在参数中定义了整形并赋值;

当我们在main函数中使用时可以传参,也可以不用传参;以下是运行结果

 可以看到当我们调用函数时,如果我们传进去参数,函数就会使用我们传进去的参数;如果不传参,那函数就会使用缺省参数。

3.2全缺省参数

定义缺省参数还可以定义多个,玩法多样

#include<iostream>
using namespace std;
void Func(int a = 1, int b = 2,int c=3)
{
	cout << a << ' ' ;
	cout << b  <<' ';
	cout << c << endl;
}

int main()
{
	Func();
	Func(10);
	Func(10,20);
	Func(10,20,30);
}

运行结果如下

 但是需要注意的是,不能间隔传参

 这样传参并不会 只调用第二个参数,这样传参是不符合规矩的。

3.3半缺省参数

和全缺省类似,半缺省就是定义函数时部分赋值

void Func(int a , int b = 2, int c = 3)
{
	cout << a << ' ';
	cout << b << ' ';
	cout << c << endl;
}

半缺省参数只能是从右向左给缺省值,并且没有在函数里给缺省值的要在调用函数时传参

 否则就会报错。

还需要注意的是缺省参数不能定义和声明分离,下面用代码示例

首先我们在.cpp文件中 定义出缺省参数

我们再在头文件中添加声明

 

继续在mian函数中测试

 

 可以看到报错了,原因很简单:当编译器调用函数的时候无法确定调用的是,h文件中声明里的缺省值还是.cpp文件中的缺省值,如果声明和定义的函数缺省值不相同就会出现冲突,

 

可以看声明和定义分离会出现以上这种情况 

所以不允许声明和定义同时给缺省参数。

 4.函数重载

首先我们要知道重载是什么意思,在我们学习语言方面重载就是一词多义的意思,之前有个段子说中国有两项运动根本不用看,一个是乒乓球,一个是足球;乒乓球谁也打不过,足球谁也打不过,这句话就构成重载;

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。

同样的,C语言中不支持同名的函数,C++却可以,但是要求构成重载(函数名相同,参数不同)。

直接上代码解释

#include<iostream>
#include"Stack.h"
using namespace std;

int Add(int x, int y)
{
	cout << "int Add(int x, int y)" << endl;
	return x + y;
}

double Add(double x, double y)
{
	cout << "double Add(double x, double y)" << endl;
	return x + y;
}
int main()
{
	cout << Add(1, 2) << endl;
	cout << Add(1.1, 2.2) << endl;
}

以下是运行结果

 可以看到在C++中可以自动识别类型,比C语言方便太多.

除了以上的参数类型不同,还有以下几种情况也可以构成重载

// 2、参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}

但是要注意的是返回值不同,是不能构成重载的

 还有一种情况是在不同作用域的函数,情况如下

 同样的这样也是不能构成该函数重载的,因为他们的作用域不同,在概念的解释中作用域不同不能够成函数重载。

以上就是本片要分享的内容,后序还有更多C++学习的内容,如果对你有帮助还请三连支持,感谢阅读。

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

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

相关文章

编译工具:CMake(三)| 最简单的实例升级

编译工具&#xff1a;CMake&#xff08;三&#xff09;| 最简单的实例升级 前言过程语法解释ADD_SUBDIRECTORY 指令 如何安装目标文件的安装普通文件的安装&#xff1a;非目标文件的可执行程序安装(比如脚本之类)目录的安装 修改 Helloworld 支持安装测试 前言 本篇博客的任务…

H3C交换机MIB库

非常齐全的官方MIB库 为Zabbix监控华三交换机提供诸多方便。 如下信息提供下载链接和下载账号: MIB清单下载:交换机-新华三集团-H3C MIB库:MIB-新华三集团-H3C

Python Opencv实践 - 图像透射变换

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols img.shape[:2] print(rows,cols)#opencv中的透射变换&#xff0c;需要一个3x3透射变换矩阵 #这个矩阵可以通过…

基于IDE Eval Resetter延长IntelliJ IDEA等软件试用期的方法(包含新版本软件的操作方法)

本文介绍基于IDE Eval Resetter插件&#xff0c;对集成开发环境IntelliJ IDEA等JetBrains公司下属的多个开发软件&#xff0c;加以试用期延长的方法。 我们这里就以IntelliJ IDEA为例&#xff0c;来介绍这一插件发挥作用的具体方式。不过&#xff0c;需要说明使用IDE Eval Rese…

Spring Boot+Redis 实现消息队列实践示例

Spring BootRedis 实现一个轻量级的消息队列 文章目录 Spring BootRedis 实现一个轻量级的消息队列0.前言1.基础介绍2.步骤2.1. 引入依赖2.2. 配置文件2.3. 核心源码 4.总结答疑 5.参考文档6. Redis从入门到精通系列文章 0.前言 本文将介绍如何利用Spring Boot与Redis结合实现…

二自由度机械臂的gazebo仿真

一、创建ros软件包 #1、创建工作空间 mkdir 2d_robot_ws cd 2d_robot_ws mkdir src cd src catkin_init_workspace #2、编译工作空间 cd .. catkin_make #3、创建软件包 catkin_create_pkg 2d_robot std_msgs rospy roscpp二、创建模型文件 1、编写urdf模型文件 在2d_robot_…

科研经费的来源有哪些?

目前&#xff0c;高校在我国科技创新中发挥着越来越重要的作用&#xff0c;自然高校获得经费也越来越多。一所高校的科研经费充足&#xff0c;越有利于科研学术水平的提高。那么科研经费的来源有哪些呢&#xff1f; 1. 国家拨款 对于高校的科研发展享有国家的重点支持。近年来…

人工智能原理(3)

目录 一、搜索策略 1、引言 2、盲目搜索 3、启发式搜索 二、基于状态空间图搜索技术 1、图搜索基本概念 2、状态空间搜索 3、一般的图搜索算法 三、盲目搜索 1、广度优先搜索 2、深度优先搜索 3、有界深度搜索和迭代加深搜索 四、启发式算法 1、启发性信息和评估…

容器技术发展和编排技术演进之路

目录 Jail 时代 1979 年 贝尔实验室发明 chroot 2000 年 FreeBSD 4.0 发行 FreeBSD Jail 2001 年 Linux VServer 发行 2004 年 Solaris Containers 发行 云时代 2006 年 google 推出 Process Containers 2008 年 LXC 推出 2011 年 CloudFoundry 推出 Warden 2013 年 LMCTFY 启动…

JavaScript 【DOM】

【DOM】 原创内容&#xff0c;转载请注明出处&#xff01; 一、DOM基本概念 DOM&#xff08;Document Object Model&#xff0c;文档对象模型&#xff09;是 JavaScript 操作 HTML 文档的接口&#xff0c;使文档操作变得非常优雅、简便。 DOM 最大的特点就是将 HTML 文档表示…

Pycharm找不到Conda可执行文件路径(Pycharm无法导入Anaconda已有环境)

在使用Pycharm时发现无法导入Anaconda创建好的环境&#xff0c;会出现找不到Conda可执行文件路径的问题。 解决 在输入框内输入D:\anaconda3\Scripts\conda.exe&#xff0c;点击加载环境。 注意前面目录是自己Anaconda的安装位置&#xff0c;之后就可以找到Anaconda的现有环…

STM32F407使用Helix库软解MP3并通过DAC输出,最精简的STM32+SD卡实现MP3播放器

只用STM32单片机SD卡耳机插座&#xff0c;实现播放MP3播放器&#xff01; 看过很多STM32软解MP3的方案&#xff0c;即不通过类似VS1053之类的解码器芯片&#xff0c;直接用STM32和软件库解码MP3文件&#xff0c;通常使用了labmad或者Helix解码库实现&#xff0c;Helix相对labm…

Mariadb高可用MHA

本节主要学习了Mariadb高可用MHA的概述&#xff0c;案例如何构建MHA 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、概述 1、概念 MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。…

如何使用Kali Linux进行渗透测试?

1. 渗透测试简介 渗透测试是通过模拟恶意攻击&#xff0c;评估系统、应用或网络的安全性的过程。Kali Linux为渗透测试人员提供了丰富的工具和资源&#xff0c;用于发现漏洞、弱点和安全风险。 2. 使用Kali Linux进行渗透测试的步骤 以下是使用Kali Linux进行渗透测试的基本…

搭建WebDAV服务手机ES文件浏览器远程访问

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 有时候我们想通过移动设备访问群晖NAS 中的文件,以满足特殊需求,我们在群辉中开启WebDav服务,结合cpolar内网工具生成的公网地址,通过移动客户端ES文件…

【Unity每日一记】进行发射,位置相关的方法总结

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

绘制世界地图or中国地图

写在前面 在8月初,自己需要使用中国地图的图形,自己就此也查询相关的教程,自己也做一下小小总结,希望对自己和同学们有所帮助。 最终图形 这个系列从2022年开始,一直更新使用R语言分析数据及绘制精美图形。小杜的生信笔记主要分享小杜学习日常!如果,你对此感兴趣可以加…

【C++面向对象】--- 继承 的奥秘(下篇)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

自动化测试用例设计实例

在编写用例之间&#xff0c;笔者再次强调几点编写自动化测试用例的原则&#xff1a; 1、一个脚本是一个完整的场景&#xff0c;从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点&#xff0c;不要试图用户登陆系统后把所有的功能都进行验证再退出系统…

CAS 的执行流程 ?CAS 中 ABA 问题如何解决 ?CAS 在 Java 中有哪些实现类 ?

目录 1. CAS 的执行流程 2. CAS 中的 ABA 问题 3. 如何解决 CAS 中的 ABA 问题 4.CAS 在Java 中的实现类有哪些 1. CAS 的执行流程 CAS 比较并替换的大致流程是这样的&#xff1a; 它有三个操作单位&#xff1a;V&#xff08;内存值&#xff09;&#xff0c;A&#xff08;…