突破编程_C++_面试(基础知识(2))

3 面试题3:形参与实参的区别

形参:函数定义时的参数,可以看作是一个占位符。形参只有在被调用的时候才分配内存单元,只在函数内部有效,调用结束后立即释放。
实参:调用函数时使用的参数,实参可以是常量、变量、表达式、函数等。如果实参和形参的类型不匹配,编译器会尝试进行类型转换。如果无法进行类型转换,编译器将会报错。
具体区别如下:
(1)内存分配:形参只有在调用的时候才会分配内存,调用结束后就会释放内存。而实参的情况就比较复杂,比如一个字符串常量的实参,其内存分配在文字常量区。
(2)类型匹配:实参和形参在数量上,类型上,顺序上应严格一致, 如果实参和形参的类型不匹配,编译器会尝试进行类型转换。如果无法进行类型转换,编译器将会报"类型不匹配"的错误。
(3)数据传送:函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。
(4)传递方式:将实参的值传送给形参的方式分为值传递、指针传递、引用传递。值传递时,形参的值发生改变,实参中的值不会变化。指针传递与引用传递时,对形参的改变会影响到实参。
重点注意
指针传递时,如果对其做创建新对象的操作( new ),则实参中的值不会变化(即不会替换为这个新创建的对象),如下为样例代码:

#include <iostream>
using namespace std;class Student
{
public:Student(const string& name){m_name = name;}~Student() {}public:string getName(){return m_name;}private:string m_name;
};void changeName(Student* st, string name)
{st = new Student(name);
}int main()
{Student* st = new Student("zhangsan");changeName(st, "lisi");printf("name = %s\n", st->getName().c_str());delete st;st = nullptr;return 0;
}

上面代码的输出为:

name = zhangsan

这是由于形参 Student* st 与实参 Student* st 实际上还是两个变量,只不过这两个变量指向同一个地址,所以对形参做操作,其操作的对象还是他们共同指向的地址,即为函数外面的 st 对象。但是当对形参做 new 操作以后,形参便指向了新的地址,该函数执行结束后,打印的字符串依然是原来 st 对象的成员变量。

4 面试题4:值传递、指针传递、引用传递的区别

4.1 按值传递

按值传递是将实际参数的值复制到形式参数。使用这种方式,调用函数本身不对实参进行操作。例如:

#include <iostream>//函数的定义
void swap(int a, int b)
{int c=a;a=b;b=c;
}int main()
{int a=1,b=2;swap(a,b);				//a,b 交换值失败printf("a=%d, b=%d\n",a,b);return 0;
}

上面代码的输出为:

a=1, b=2

4.2 按引用传递

按引用传递是将实际参数的地址传递给形式参数,此时的形参相当于实参的别名。使用这种方式,对形参的改变会影响到实参。例如:

#include <iostream>//函数的定义
void swap(int &a, int &b)
{int c=a;a=b;b=c;
}int main()
{int a=1,b=2;swap(a,b);				//a,b 交换值成功printf("a=%d, b=%d\n",a,b);return 0;
}

上面代码的输出为:

a=2, b=1

4.3 按指针传递

按指针传递是指将实参的地址传递给形参,函数内部可以通过指针来操作实参的值。但需要注意指针为空的情况。样例代码如下:

#include <iostream>//函数的定义
void swap(int* a, int* b)
{int c=*a;*a=*b;*b=c;
}int main()
{int a=1,b=2;swap(&a,&b);				//a,b 交换值成功printf("a=%d, b=%d\n",a,b);return 0;
}

上面代码的输出为:

a=2, b=1

需要注意的是:从效率上来说,按引用传递与按指针传递基本一样(按值传递有拷贝过程,性能很差),不过从安全角度出发,引用传递在参数传递过程中执行强类型检查,而指针传递的类型检查较弱,特别的,如果参数被声明为 void ,那么就不会做类型检查。所以推荐只用引用传递,最好不用指针传递。

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

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

相关文章

为什么Vue3双向绑定使用Proxy

Vue2 使用Object.defineProperty无法监听删除属性的操作需要遍历目标对象的所有属性并加上 setter getter 才能监听对于对象的新增属性&#xff0c;需要手动监听在遇到一个对象的属性还是一个对象的情况下&#xff0c;需要递归监听。对于数组通过push、unshift方法增加的元素&…

老版本O记12C上线前的一些调整

ORACLE 12c的数据库&#xff0c;以多租户方式运行&#xff0c;运行了一段时间&#xff0c;还比较稳定&#xff0c;分享一下相关参数修改。 1、一些参数 DEFERRED_SEGMENT_CREATION 默认是true&#xff0c;建议设置为false _DATAFILE_WRITE_ERRORS_CRASH_INSTANCE 默认是tr…

Debezium系列之:MariaDB10.5以上版本赋予数据库账号读取binlog权限的变化

Debezium系列之:MariaDB10.5以上版本赋予数据库账号读取binlog权限的变化 一、背景二、BINLOG MONITOR权限三、BINLOG MONITOR和REPLICA MONITOR的区别四、MariaDB版本升级的影响五、总结一、背景 数据接入会检测账号是否具有REPLICATION SLAVE、REPLICATION CLIENT的权限Mari…

缓存相关问题记录解决

缓存相关问题 在这里我不得不说明,我写的博客都是我自己用心写的,我自己用心记录的,我写的很详细,所以会有点冗长,所以如果你能看的下去的化,会有所收获,我不想写那种copy的文章,因为对我来说没什么益处,我写的这篇博客,就是为了记录我缓存的相关问题,还有我自己的感悟,所以如果…

TypeScript(十) Map对象、元组、联合类型、接口

1. Map对象 1.1. 简述 Map对象保存键值对&#xff0c;并且能够记住键的原始插入顺序。   任何值都可以作为一个键或一个值。 1.2. 创建 Map 使用Map类型和new 关键字来创建Map&#xff1a; 如&#xff1a; let myMap new Map([["key1", "value1"],[&…

C# 获取计算机信息(操作系统/硬件)

C#我们可以通过类库System.Management获取计算机的基础信息。总结了一个通用类&#xff0c;只要根据参考信息填入path和key就可以获取相应的信息。这个只是针对单个设备&#xff0c;如果有多个设备单独写下就可以了。参考信息中key的":"和后边为说明信息&#xff0c;…

inotify学习

inotify的原理 inotify是Linux内核的一个子系统&#xff0c;它提供了一个通用的框架来监控文件系统的变化。使用inotify&#xff0c;应用程序可以订阅和获取文件或目录状态变化的通知&#xff0c;如文件写入、读取、创建、删除、属性更改等。 inotify的工作原理分为以下几个步…

探索未来发展方向:图片转换为Excel表格的智能化与自动化

随着科技的不断进步&#xff0c;人工智能技术已经在许多领域得到广泛应用。其中&#xff0c;将图片转换为Excel表格的智能化与自动化技术成为了备受关注的新兴领域。这一技术的发展&#xff0c;不仅可以极大地提高工作效率&#xff0c;还能为数据分析提供更为准确和便捷的方式。…

上传文件的用例怎么设计

功能测试 符合要求的文件上传成功上传成功的文件名显示正常可查看、下载上传成功的文件删除上传成功的文件替换上传成功的文件上传文件是否支持中文文件路径是否可手动输入手动输入正确的文件路径上传成功手动输入错误的文件路径上传失败 文件大小测试 文件大小为0kb的文件上传…

PRBS并行输出

PRBS&#xff08;Pseudo-Random Binary Sequences&#xff09;是通过LFSR和特征函数 伪随机数发生器产生的伪随机数序列&#xff0c;通常用于高速数字通信测试。 基本电路&#xff08;单比特输出&#xff09; prbs N表示用N比特lfsr尝试伪随机数序列&#xff0c;常用的有N7,9…

创建与删除数据库(四)

创建与删除数据库&#xff08;四&#xff09; 一、创建数据库 1.1 使用DDL语句创建数据库 CREATE DATABASE 数据库名 DEFAULT CHARACTER 示例&#xff1a; 创建一个test 的数据库&#xff0c;并查看该数据库&#xff0c;以及该数据库的编码。 创建数据库&#xff1a; cre…

4G路由器助力智慧农业数据采集与远程管理

随着科技日新月异的发展&#xff0c;智慧农业正逐渐改变着传统农业生产模式。4G路由器作为物联网技术的关键通信设备&#xff0c;在实现农业现场传感器数据实时采集与远程在线管理方面发挥着重要作用&#xff0c;以下智联物联分享4G路由器在智慧农业中的应用优势。 农业现场传感…

机器学习-聚类算法Kmeans【手撕】

聚类算法 在训练时&#xff0c;使用没有标签的数据集进行训练&#xff0c;希望在没有标签的数据里面可以发现潜在的一些结构。 其中使用范围较广的是&#xff0c;聚类算法。聚类算法的目的是将数据划分成有意义或有用的组&#xff08;或簇&#xff09;。这种划分可以基于我们的…

自动保存知乎上点赞的内容至本地

背景&#xff1a;知乎上常有非常精彩的回答/文章&#xff0c;必须要点赞收藏&#xff0c;日后回想起该回答/文章时翻看自己的动态和收藏夹却怎么也找不到&#xff0c;即使之前保存了链接网络不好也打不开了&#xff08;。所以我一般碰到好的回答/文章都会想办法保存它的离线版本…

社交买量:归因统计的核心要素与工具

在当今的社交App推广领域&#xff0c;广告买量已成为企业获取用户的重要手段。然而&#xff0c;如何准确衡量这些买量活动的成效&#xff0c;即用户从广告访问到安装后行为的完整转化路径&#xff0c;一直是运营人员关注的焦点。归因统计是一种评估营销效果的关键技术方案&…

python爬虫-多线程-数据库——WB用户

数据库database的包&#xff1a; Python操作Mysql数据库-CSDN博客 效果&#xff1a; 控制台输出&#xff1a; 数据库记录&#xff1a; 全部代码&#xff1a; import json import os import threading import tracebackimport requests import urllib.request from utils im…

论文阅读-一个用于云计算中自我优化的通用工作负载预测框架,

论文标题&#xff1a;A Self-Optimized Generic Workload Prediction Framework for Cloud Computing 概述 准确地预测未来的工作负载&#xff0c;如作业到达率和用户请求率&#xff0c;对于云计算中的资源管理和弹性非常关键。然而&#xff0c;设计一个通用的工作负载预测器…

docker-compose安装配置jenkins

archery 安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-composechmod 755 /usr/local/bin/docker-composedocker-compose version 安装docker yum install epel-rel…

【每日一题】6.LeetCode——轮转数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

【nginx实战】通过nginx实现http 长连接(即keep alive)

文章目录 一. http的长连接历史1. HTTP短连接模型2. HTTP长连接模型 二. nginx作为代理时实现HTTP长连接1. nginx与client的长连接1.1. keepalive_timeout指令1.2. keepalive_requests指令* 场景分析 2. 保持和server的长连接2.1. location设置* 场景分析 2.2. upstream设置* 场…