C++入门篇(一)

news2024/11/12 13:47:03

目录

  • 一、C++关键字汇总
  • 二、命名空间
    • 2.1 命名空间的定义
    • 2.2 命名空间的使用
  • 三、C++的输入和输出
  • 四、缺省参数
  • 五、函数重载
    • 5.1 函数重载的概念
    • 5.2 C++支持函数重载的原理是什么?

一、C++关键字汇总

在C++98标准下,C++一共有63个关键字,C语言一共有32个关键字。以下是对C++关键字的汇总。
在这里插入图片描述

二、命名空间

你有没有过这样的经历,当你在C语言写某个项目的的时候,创建了一个变量,假如是Add,编译器立刻就给你报了一个错,说该变量重定义了,即命名冲突,意思就是你的这个变量已经被定义过了,但是你看了一眼你的代码,发现你之前没有定义过这个变量啊,此时你蒙了,上百度查了一下,发现有人说标准库里面也定义了一个Add,所以你的这个Add变量就是重定义了,你就立马把你的Add改成了其它的名称,就能编译通过了,但是由于这个项目是你们小组共同写的,等到大家都写完了自己的那一部分代码之后就合并成一个项目运行的时候,发现里面有上百个重定义的变量,这时候整个人都崩溃了。要一个一个地修改变量名。
显然,这样的场景使得程序员维护代码的成本变得太高了,发明C++的大佬当然也意识到了这个问题,所以大佬就想:我用一件“外套”封装自己写的那段代码,然后在合并的时候需要用哪件“外套”里面的变量就在变量前指定去哪里找这个变量,这样就能解决命名冲突问题了,这件“外套”就叫做命名空间。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,C++中namespace关键字的出现就是针对这种问题的。

2.1 命名空间的定义

那么命名空间怎么定义呢?
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中的即为命名空间的成员。
在这里插入图片描述
在这里插入图片描述
3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间。
注意:一个命名空间定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

2.2 命名空间的使用

我们如何使用命名空间里面的变量或者函数呢?
有三种方式:
1、可以在使用命名空间中的变量、类型或者函数前写上:
命名空间的名字+作用域限定符。
在这里插入图片描述

2、使用using将命名空间中某个成员引入
在这里插入图片描述

3、使用using namespace 命名空间名称 引入
在这里插入图片描述

三、C++的输入和输出

在这里插入图片描述

cin和cout输入输出不用指定类型,编译器会自动判断:

#include <iostream>
using namespace std;
int main()
{
	int a = 0;
	double b = 0;

	//可以自动识别变量的类型
	cout << "输入a,b:    ";
	cin >> a >> b;
	cout << "输出a,b:    ";
	cout << a << " " << b << endl;

	return 0;
}

在这里插入图片描述

std命名空间的使用惯例:
std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中不要直接展开整个std命名空间,应该像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式使用std中的内容。

四、缺省参数

什么是缺省参数?
缺省参数是声明或定义函数时为函数的参数指定一个缺省值(即默认值)。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
在这里插入图片描述

缺省参数分类:
缺省参数分为全缺省和半缺省两种。

全缺省参数:
在这里插入图片描述
半缺省参数:
半缺省参数是指部分参数缺省,不一定是刚好一般的参数缺省。
在这里插入图片描述
需要注意的是:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给。因为当我们传参的时候默认是从左往右传参的,如果第一个参数x给了缺省值,那么在调用的时候传两个实参过来就会把这两个参数给x和y,而z没有缺省值但是也没有接收到实参,就会出问题,但是从右往左缺省就是z有缺省值,传过来的两个实参给了x和y,这样就能正常地调用函数。
  2. 缺省值必须是常量或者全局变量
  3. C语言不支持(编译器不支持)
  4. 缺省参数不能在函数声明和定义中同时出,原因如下:
//a.h
void Func(int a = 5);
// a.cpp
void Func(int a = 10)
{}
// 注意:如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用哪个缺省值。

那么应该是声明的时候给缺省值还是定义的时候给缺省值呢?
这就有必要回顾到编译链接的内容了,我们知道,一般来说,函数的声明是放在.h文件里的,定义放在.cpp文件里,那么在编译的时候是把头文件展开到.cpp文件中,所有在编译的过程中.cpp文件只能看见函数的声明,并不能看见函数的定义的,如果缺省值写在函数的定义处,那么证明在编译的时候.cpp文件中调用这个函数,就必须按照形参的个数传实参,有3个形参就要传3个实参,但是由于这里的形参是有缺省值的,如果是全缺省,那么不需要传实参也是能调用这个函数的,因为声明处没有注明缺省值而导致这个函数调用不了,这显然是不对的。但是如果缺省值写在函数的声明处,那就不存在这个问题了,所以函数的缺省值既不能同时出现在函数的生命和定义处,也只能在声明处给缺省值。

五、函数重载

5.1 函数重载的概念


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

#include <iostream>
using namespace std;

//以下三种情况都能构成函数重载

//1、函数的参数类型不同
int Add(int x, int y)
{
	return x + y;
}
double Add(double x, double y)
{
	return x + y;
}

//2、函数的参数类型顺序不同
double Sub(int x, double y)
{
	return x - y;
}
double Sub(double x, int y)
{
	return x - y;
}

//3、函数的参数的个数不同
void Print(int x, int y)
{
	cout << x << ":" << y << endl;
}
void Print(int x, int y, int z)
{
	cout << x << ":" << y << ":" << z << endl;
}

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

	cout << Sub(1, 2.2) << endl;
	cout << Sub(2.2, 1) << endl;

	Print(1, 2);
	Print(1, 2, 3);


	return 0;
}

注意,返回值的类型不同不能构成函数重载!!!

5.2 C++支持函数重载的原理是什么?

为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序运行起来需要经历:预处理,编译,汇编,链接。详情可以看以下这篇博客:https://blog.csdn.net/weixin_70056514/article/details/128958086

  1. 实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
  2. 链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
  3. 那么链接时,面对Add函数,链接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。
  4. 由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们使用了g++演示了这个修饰后的名字。

在这里插入图片描述

对以上代码用gcc命令编译:

在这里插入图片描述
在这里插入图片描述
编译后得到以下的汇编代码:

在这里插入图片描述

可以看到,C语言的函数名修饰规则就是函数名本身,因为在链接时链接器需要到由.cpp编译生成的.o文件的符号表中寻找函数名对应的地址,再拿着这个地址去找函数的定义,但是从上面的现象可以知道,如果C语言写两个函数名相同的函数,即函数重载,那么编译后生成的汇编代码的函数名是它本身,这就导致在符号表中取函数的地址取找函数的定义的时候具有二义性了,链接器不知道该取哪个函数名的地址,因为它们都是一样的,所以C语言就不能支持函数重载了。

那C++呢?
在这里插入图片描述
上面这段代码执行g++指令编译:
在这里插入图片描述
在这里插入图片描述
编译后生成的汇编代码如下:

在这里插入图片描述
通过上面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。

结论:在linux下,采用g++编译完成后,函数的名字被修饰发生了改变,编译器将函数参数类型信息添加到修改后的名字中。

由此可知C++之所以能支持函数重载,是因为它在编译生成汇编代码时函数名的修饰规则进行了改进,使得函数名相同,参数不同时修饰后的函数名不同,从而取消了链接时可能出现的二义性。

如果两个函数的函数名和参数是一样的,返回值不同是不构成重载的,因为返回值信息并不出现在修饰后的函数名中,所以调用时编译器是没办法区分的。

以上就是今天要介绍的内容,如果对你有帮助,那么就点亮一下小心心,点点关注呗!后期会持续更新C++相关的内容哦,我们下期见!!!

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

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

相关文章

第二章 设计模式七大原则

文章目录 前言一、单一职责 &#x1f367;1、单一职责原则注意事项和细节2、代码实现2、1 错误示例2、2 正确示例但有缺陷2、3 最终形态 二、接口隔离原则 &#x1f969;1、代码示例 三、依赖倒转原则 &#x1f965;1、代码示例2、依赖关系传递的三种方式 四、里氏替换原则 &am…

【C 语言】习题 1 - 用代码将二进制转换为十进制

目录 1、缘起 2、算法描述 3、代码清单 4、相关知识点 5、总结 1、缘起 我以前计算二进制转换为十进制的时候&#xff0c;喜欢用笔算&#xff0c;或者电脑在手旁的时候&#xff0c;用电脑自带的程序员计算器进行计算。今天兴起&#xff0c;突然想写一个代码用于计算…

Bootstrap框架实战:轻松搭建响应式网站

Bootstrap 是一款非常受欢迎的前端开发框架&#xff0c;它可以帮助我们轻松地搭建响应式网站。在这篇文章中&#xff0c;我们将介绍如何使用 Bootstrap 框架创建一个简单的响应式网站&#xff0c;并了解其核心概念和组件。 1. Bootstrap 简介 Bootstrap 是由 Twitter 公司的开…

字节码插桩:从分析class文件结构开始

作者&#xff1a;小马快跑 Class字节码 Java 能做到 一次编译&#xff0c;到处运行&#xff0c;主要就是靠 class字节码 文件&#xff0c;也就是 java 文件经过编译之后 .java -> .class&#xff0c;然后再被 JVM 虚拟机加载。其实&#xff0c;不仅是 java 语言&#xff0c…

每日做题总结——day02

目录 字符串处理函数&#xff0c;strcpy&#xff0c;strcat 数组指针 函数缺省值 初始化列表​编辑 友元函数 new与delete 静态成员变量 new与构造函数 delete与析构函数 拷贝构造函数的特点 常成员函数 初始化列表 编程题 字符串中找出连续最长的数字串 数组中超过…

字节的面试,你能扛住几道?

C &#xff0c; Python 哪一个更快&#xff1f; 读者答&#xff1a;这个我不知道从哪方面说&#xff0c;就是 C 的话&#xff0c;它其实能够提供开发者非常多的权限&#xff0c;就是说它能涉及到一些操作系统级别的一些操作&#xff0c;速度应该挺快。然后 Python 实现功能还…

从数据到应用 Web3不再纸上谈兵

继宣布拨款5000万港元加速推动Web3生态圈发展后&#xff0c;香港再次明确对Web3产业创新的支持。近日&#xff0c;香港Web3协会正式成立&#xff0c;创立Web3Hub基金&#xff0c;“东方之珠”正在大力推进第三代互联网的生态建设。 不仅仅是政策红利&#xff0c;ChatGPT等人工…

Web服务器配置(Tomcat)【Centos】

Tomcat 是一个轻量化服务器&#xff0c;理论上支持 20,000 个用户 LNMP&#xff1a;Linux Nginx MySQL LTMP&#xff1a;Linux Tomcat MySQL 1.Apache Tomcat 从版本7开始&#xff0c;若仅仅只需要部署HTML静态页面&#xff0c;Apache就可以完全够用 查看Apache是否安装 rpm -…

Ajax的特性以及用法

一、什么是Ajax 1、jQuery的Ajax ①&#xff1a;get方法​编辑 ②&#xff1a;post方法 ③&#xff1a;Ajax&#xff08;这个重要&#xff0c;jQuery的ajax最常用&#xff09; PS&#xff1a;一定要注意&#xff0c;数据类型是 json &#xff01;&#xff01;&#xff01; …

google breakpad中minidump_stackwalk的编译(Windows)

接上一篇的内容&#xff1a; breakpad编译指南&#xff08;Windows&#xff09;_我的胖是因为太膨胀的博客-CSDN博客 1、获取 googletest 放进 breakpad/src 目录下&#xff0c;并把目录名重命名为testing git clone https://github.com/google/googletest.git 如下图 2、把…

ROS2安装教程(virtualbox7.0.6+ROS2)

整个过程分两步&#xff1a;先安装Virtualbox&#xff0c;再安装ROS2 一、安装virtualbox7.0.6 网址&#xff1a;https://www.virtualbox.org/wiki/Downloads 问题1 安装时报错&#xff1a;缺少python core 、win32api依赖&#xff08;下图网上拷贝的图&#xff0c;版本忽略…

这份完整WhatsApp营销方案请收好!

WhatsApp是什么&#xff1f; WhatsApp是一种跨平台的即时通讯应用程序&#xff0c;可以在手机、平板电脑和电脑上使用。它允许用户发送文字消息、语音消息、图片、视频和文件等内容&#xff0c;同时还可以进行语音通话和视频通话。 WhatsApp拥有多种功能&#xff0c;包括但不…

Windows下通过CMake编译hiredis及应用

1、 在下载的redis-6.2.12.tar.gz的压缩包中&#xff0c;解压后有个deps文件夹&#xff0c;里面有个hiredis文件夹&#xff0c;是我们访问redis的C接口&#xff0c;需要我们手动编译后才能使用。&#xff08;redis: https://redis.io/download/&#xff09; 2、打开CMake软件&…

日本PSE认证日本的電気用品安全法METI备案

日本的電気用品安全法&#xff08;PSE认证&#xff09;法规要求日本的采购商在购进商品后一个月内必须向日本METI注册申报&#xff0c;并必须将采购商名称或ID标在产品上&#xff0c;以便在今后产品销售过程中进行监督管理&#xff0c;完成后将获得電気用品製造事業届出書&…

全球化背景下,如何利用内容营销促进跨境电商业务增长

随着全球跨境电商市场的迅速发展&#xff0c;越来越多的企业开始将注意力转向跨境电商。然而&#xff0c;随着竞争的激烈化&#xff0c;企业不再能够仅仅依靠产品本身来吸引消费者的注意。因此&#xff0c;内容营销成为了跨境电商企业在吸引、留住消费者方面的关键。在这篇文章…

【Spring】— Spring AOP

目录 一、Spring AOP简介1.什么是AOP2.AOP术语 二、AspectJ开发1.基于XML的声明式AspectJ1.1 配置切面1.2 配置切入点1.3 配置通知 2.基于注解的声明式AspectJ 一、Spring AOP简介 1.什么是AOP AOP的全称是Aspect-Oriented Programming&#xff0c;即面向切面编程&#xff08;…

芴甲氧羰酰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS

修饰性PEG芴甲氧羰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS是保护氨基的PEG衍生物之一 结构式&#xff1a; 芴甲氧羰酰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS聚乙二醇化可以提高聚乙二醇分子的稳定性&#xff0c;降低其免疫原性&#xff0c;仅用于科研实验。 FMOC-NH…

骨传导风靡蓝牙耳机市场 AI赋能有望打破行业技术桎梏

一、骨传导耳机行业概述 骨传导耳机是运用骨传导技术应用制造的耳机&#xff0c;听到的大部分声音都是声波经过空气到达骨膜振动进而将声音传入内耳&#xff0c;另一种方式是声波通过骨震动可以直接传至内耳。骨传导耳机可分为骨传导扬声器技术应用耳机、骨传导麦克风技术应用…

关于比较中设置极大值,常设置的0x3f3f3f3f

无穷大常量 int型变量的取值范围&#xff1a;[-2^31, 2^31 - 1] -> [-2147483648, 2147483647] 0x7fffffff 2147483647 (2^31 - 1) (1 << 31) - 1 0x3fffffff 1073741823 (2^30 - 1) (1 << 30) - 1 0x3f3f…

产品经理必读 | 俞军产品经理十二条军规

最近在学习《俞军产品方法论》&#xff0c;觉得俞军总结的十二条产品经理原则非常受用&#xff0c;分享给大家。 01. 产品经理首先是产品的深度用户 自己设计的产品都没使用过的产品经理&#xff0c;如何明白用户使用的问题&#xff0c;如何解决问题&#xff0c;所以产品经理肯…