C++基础语法重点总结

函数重载

说说什么是函数重载

函数重载指的是在同一个作用域中,声明了具有相同函数名的函数,它们的参数列表不同,也就是说参数类型不同,参数个数不同,参数顺序不同,返回值同不同都可以。

写一个函数重载的例子:

/*函数重载*/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()
{int ret1 = add(1, 2); //3double ret2 = add(5.5, 4.3);//9.8cout << ret1 << " " << ret2 << endl;return 0;
}

为什么C语言不支持函数重载?

因为在链接阶段生成符号表的时候,C语言对函数取名的时候,只会拿函数名进行取名,如果有函数重载的话,没办法区分函数的不同。而C++在取名的时候,是将函数名和参数类型的首字符结合起来对函数的取名,这样就可以区分函数的不同了。

拓展:说说函数重载、函数重写、函数重定义区分:

在作用域中:函数重载在需要在同一个作用域中。函数重定义和函数重写的两个函数必须一个在父类中,一个在子类中,而且函数重写必须是虚函数。

函数重载和函数重定义需要的是函数名相同,参数列表不同,函数重写需要函数名相同、参数列表相同和返回值相同(例外情况是协变和析构函数的重写。协变是返回值可以不同,但是返回值必须是父子关系类的指针或引用。析构函数的重写是函数名不相同)。

引用

说说什么是引用

引用就是给一个变量取别名,跟被引用的变量共用一块地址空间。比如

int a = 10;
int& ra = a;

在定义的时候必须进行初始化,而且初始化后不能改变引用对象。

说一说引用和指针的区别

①引用在定义时必须初始化,而指针不需要。②引用不能初始化为空引用,而指针可以初始化为空指针。③引用初始化后不能改变指向对象,而指针可以改变指向。④引用没有开辟内存,是与被引用的变量共用内存地址,而指针是开辟了新的空间,用于存放被指向的变量的地址⑤在使用sizeof的时候,引用的结果是引用类型大小,指针的结果是地址空间所占的字节个数。比如有一个double类型的变量b,其引用为rb和指针为pb,那么在sizeof后,得出的结果是8和4.其中,8是double类型的大小,而4是32位平台下,指针的大小。

double b = 6.6;double& rb = b;double* pb = &b;cout << sizeof(rb) << endl;//8cout << sizeof(pb) << endl;//4

⑥引用在自加的时候,是引用的那个实体加一,而指针自加是向后偏移一个类型大小。比如当rb+1,那么是b从6.6变成7.6,而pb+1,是地址往后偏移了4位。

	cout << rb + 1 << endl;//7.6cout << pb<<"->" << pb + 1 << endl;//0055FA6C->0055FA74--每次编译运行都会变

说一说引用的场景,有什么好处

引用一般使用在参数和返回值上面。可以通过引用减少拷贝,提高程序的效率。而作为返回值的话,引用的对象必须不能随函数的销毁而销毁。

关键字

static关键字

说一说static的作用:

static用于修饰局部变量、全局变量和函数。

被修饰的局部变量变成静态局部变量,其作用域不变,但是改变了生命周期,会跟随程序的结束而销毁。

被修饰的全局变量会变成静态全局变量,其作用域改变,不再具有外部链接属性,其它源文件不能使用extern来声明外部符号从而引用这个变量。

被修饰的函数会变成静态函数,其作用域改变,不再具有外部链接属性,其它源文件不能通过extern来声明从而引用这个函数。

在类中,成员变量被修饰后,是属于所有类的,所有类的对象都可以调用它,而且是不需要this指针去引用。

inline关键字

说一说inline关键字

被inline修饰的函数会变成内联函数,在编译的时候,编译器会将内联函数进行展开,不好有函数栈帧的开销。在短小而且频繁调用非递归的函数可以使用内联函数。

说一说宏的优缺点,有什么解决办法

宏的优点是增强代码的复用性,比如用宏来定义一个常量,那么在后续的代码中我或许需要多次用到这个常量。还有就是可以提高性能。比如需要实习一些简单的加减功能的函数,可以使用宏来定义,就避免了函数的栈帧开销,提高性能。

缺点是不方便调式,因为在编译期间进行了替换。代码的可读性比较差,宏展开后代码可能会变得复杂,冗余。没有类型安全的检查,在宏中不会对参数类型进行检查。

写一个宏替换的例子

#define add(x,y) x+y int main()
{int a = 1, b = 2;cout << add(a, b) << endl;return 0;
}

解决办法是使用内联函数和常量定义,比如const、enum来替换。

const关键字

说一说const关键字

const除了上述,可以使用const来替换宏定义,因为const常量定义是可以进行类型检查、并且具有作用域。

const还能用来修饰局部变量,修饰常量字符串,修饰指针和修饰函数的参数和返回值。

说一说修饰指针的情况

const修饰指针,分有常量指针和指针常量。

常量指针说的是指针的指向是一个常量,不可以通过指针去修改这个常量的值,但是指针可以改变指向。

指针常量说得是它是一个常量,它不可以改变指向,但是可以通过指针修改指向的内容。

	const int* a;//常量指针,指针a指向的内容不可以通过指针去改变指向的内容,但是可以改变指向int const* a;//常量指针int* const a;//指针常量,可以通过指向a去修改内容,但是不可以改变指向const char* a = "abc";//字符串常量,不可以修改内容和指向

sizeof关键字

sizeof关键字是一个运算符,用来计算数据类型大小,会包含'\0'

strlen是一个函数,计算的是字符串有效字符的长度,不包含'\0'

比如

	const char* str1 = "abcde";//sizeof==4,指针的大小是4/8   strlen=5/字符串实际长度char str2[] = "abcd";//sizeof==5,不是指针,因此算的是字符串的内存大小,加上\0  strlen=4 字符串实际长度char str3[5] = { 'a' };//sizeof==5  char类型数组的内存大小  strlen计算来的是随机值,因为没'\0'int str4[5] = { 'a' };//sizeof==20  int类型数组的内存大小  strlen计算来的是随机值,因为没'\0'char str5[] = { "012345678" };//sizeof==10 strlen==9

volatile关键字

volatile是一种类型修饰符,作用是当一个变量被声明为volatile时,编译器会禁止将该变量的读取和写入操作放入寄存器中,确保每次读取和写入都直接访问内存。使用场景一般是在多线程的共享变量上。

const和volatile结合使用,可以让该变量具有常量,且不会被编译器优化。当其它一些线程对该变量进行修改时,可以告诉编译器,这个变量不要优化,可以去内存中读取最新的值。

指针被volatile修饰

告诉编译器该指针所指向的对象可能会在不同的时间被外部因素更改,并且在访问该指针时应该直接读取或写入内存,而不做任何优化。

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

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

相关文章

【JavaScript】执行机制

JavaScript 的执行机制主要是基于事件循环&#xff08;Event Loop&#xff09;和单线程的特性。以下是关于 JavaScript 执行机制的一些重要概念&#xff1a; 单线程&#xff1a;JavaScript 是单线程的语言&#xff0c;意味着它只有一个主线程用来执行代码。这个特点决定了 Java…

论文写作常用词句积累

X 连接词 表目的To this end/Toward that endto do soto this aimso as toTo tackle these issuesfor the sake ofaiming to do表转折howeverNevertheless表递进moreverFurthermore表对比on the other hand/On the contraryAlternativelyas in the case ofwhereas表顺序in a f…

Photoshop 2023 25.0beta「Mac」

Photoshop 2023是一款专业图像处理软件&#xff0c;它主要用于图像编辑、合成和设计等方面。 Photoshop beta创新式填充的功能特色包括&#xff1a; 自动识别和删除对象&#xff1a;该功能可以自动识别图像中的对象&#xff0c;并用周围的图像填充空白部分&#xff0c;使图像看…

从零到精通:学习这些R语言必学包成为数据分析高手!

一、操作数据 ❝ tidyverse ❞ tidyverse是一个强大的R语言数据分析工具集&#xff0c;包含了多个核心包。其中包括ggplot2用于数据可视化、dplyr用于数据处理和转换、tidyr用于数据整理和重塑、readr用于数据导入和读取、purrr用于函数式编程、stringr用于字符串处理等。 ❝ d…

认识FFMPEG框架

FFMPEG全称: Fast Forward Moving Picture Experts Group (MPEG:动态图像专家组) ffmpeg相关网站: git://source.ffmpeg.org/ffmpeg.git http://git.videolan.org/?pffmpeg.git https://github.com/FFmpeg/FFmpeg FFMPEG框架基本组件: AVFormat , AVCodec, AVDevice, AVFil…

java使用jsqlparser实现入参,并生成可执行sql

话不多说&#xff0c;直接上 验证通过的代码 第一个例子&#xff1a; package jdbc;import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.parser.CCJSqlP…

Zabbix监控系统

目录 一、zabbix简介 1.1 zabbix 是什么&#xff1f; 1.2 zabbix 监控原理 二、安装zabbix 5.0 2.1 部署 zabbix 服务端 2.2 部署 zabbix 客户端 2.3 自定义监控内容 作为一个云计算行业从业人员&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff…

深度学习知识回顾

1*1卷积的作用&#xff1a; 1x1卷积&#xff08;1x1 convolution&#xff09;在卷积神经网络&#xff08;CNN&#xff09;中起着多种重要的作用。尽管它的卷积核尺寸很小&#xff0c;但它可以在网络中引入以下功能&#xff1a; 1.降维和增加通道&#xff1a;1x1卷积可以用于减…

实力认证!TDengine 入选 Gartner 中国数据分析与人工智能技术成熟度曲线

近日&#xff0c;国际权威研究机构 Gartner 发布了《2023 年中国数据分析及人工智能技术成熟度曲线》&#xff08;即《Hype Cycle for Data, Analytics and AI in China, 2023》&#xff09;报告&#xff0c;TDengine 成功入选实时数据管理领域代表产品。 作为评估全球新技术成…

[QT编程系列-39]:用户界面UI - 样式表QSS与样式文件快速入门

目录 1. 概述 2. CSS 3. QSS示例 4. QT样式表文件使用方法与步骤 5. QT内置样式 6. QT常见基本样式 1. 概述 Qt提供了一种称为Qt样式表&#xff08;Qt Style Sheets&#xff09;的机制&#xff0c;可以用于自定义和美化Qt应用程序的用户界面&#xff08;UI&#xff09;。…

Android 13 Hotseat定制化修改——002 hotseat图标数量修改

目录 一.背景 二.实践方案 一.背景 由于需求是需要自定义修改Hotseat&#xff0c;所以此篇文章是记录如何自定义修改hotseat的&#xff0c;应该可以覆盖大部分场景&#xff0c;修改点有修改hotseat布局方向&#xff0c;hotseat图标数量&#xff0c;hotseat图标大小&#xff0…

【MySQL安装】卸载与安装MySQL 5.7.X版本

最近由于各种原因&#xff0c;需要重新安装MySQL。之前我的版本是8.0版本&#xff0c;现在装的5.7版本。记录一下自己的安装过程。 目录 1、卸载MySQL8.0 2、安装MySQL5.7 1、卸载MySQL8.0 如何彻底卸载MySQL_mysql 完全卸载_m0小麦麦的博客-CSDN博客相信不少小伙伴们在安装…

EasyPoi导出 导入(带校验)简单示例 EasyExcel

官方文档 : http://doc.wupaas.com/docs/easypoi pom的引入: <!-- easyPoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version></dep…

Linux中无法忘记mysql密码处理办法

找到/etc/my.cnf或者/etc/mysql/my.cnf文件 添加下面两行代码&#xff0c;取消密码验证 [mysqld] skip-grant-table使用命令登录&#xff1a;mysql -u root -p&#xff0c;回车&#xff0c;回车使用sql语句来修改密码 mysql>use mysql; mysql>update user set password…

K-01BFS(2023河南萌新联赛第(五)场:郑州轻工业大学)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 思路&#xff1a; 直接枚举这个图中的拐点 这个拐点是经过左右平移到上下平移或者上下平移到左右平移 假设这个点事左到右后然后再从下到上 左到右就相当于走了个最长上升子序列&#xff0…

Java基础入门篇——数组初识

一、数组 1.假设某公司有100个员工&#xff0c;需要统计某公司员工的工资情况&#xff0c;首先需要声明100个变量来分别记每个员工的工资&#xff0c;那么如果按照之前的做法&#xff0c;可能定义的结构如下所示&#xff1a; int a1,a2,a3,......a100; 要求你输出这100个员工…

JavaWeb学习|JSTL表达式

1.什么是JSTL表达式&#xff1f; JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签&#xff0c;可以供我们使用&#xff0c;标签的功能和Java代码一样 在JSP页面文件中使用JSTL表达式&#xff0c;首先需要引入核心标签库 同时&#xff0c;也要把JSTL的jar包在to…

C指针:程序员的神奇箭头,穿越内存的冒险之旅!

目录 &#x1f575;️‍♂️ 引言&#xff1a;指针&#xff0c;那些指向星星的小箭头&#xff01; 一、&#x1f3af; 探索箭头&#xff1a;指针的基础知识 1.1 指针是什么&#xff1f; 1.2 解引用操作符&#xff1a;* 是关键 1.3 指针的比较和运算 1.4 空指针&#xff1a…

深度使用苹果M1 Mac电脑一个月后的发现与问题解决

自从苹果推出M1芯片的Mac电脑后&#xff0c;其强大的性能和高效的能耗管理引起了广泛关注。许多人纷纷购买了这款新一代的Mac电脑&#xff0c;并深度使用了一个月。然而&#xff0c;在长时间使用的过程中&#xff0c;一些问题也逐渐浮现出来。本文将分享在深度使用苹果M1 Mac电…

进程的调度

文章目录 一、进程的调度过程二、进程调度的一些特点 一个正在执行的程序叫做进程。操作系统会把程序调度到CPU上&#xff0c;让CPU执行程序&#xff0c;此时这个程序就变成了进程。相当于程序在CPU上执行时叫进程&#xff0c;程序没有在CPU上执行时就叫程序。 一、进程的调度过…