C++开发基础之函数参数传递的几种类型
一、前言
在C++中,接口指针或类对象的函数参数传递是一个常见的做法,特别是在需要支持多态或动态绑定时。这里将介绍如何传递接口指针或类对象作为函数参数。
二、函数参数传递的几种类型
抽象类(接口)的实例只能通过指针或引用传递,不能作为值传递。具体类的实例可以通过指针、值或引用传递。指针传递和值传递都会创建对象的副本,而引用传递会直接操作原始对象。
示例代码:
#include <iostream>
// 定义一个接口类
class IMyInterface {
public:virtual void myMethod() = 0; // 纯虚函数,必须被实现
};
// 定义一个类,它实现了IMyInterface接口
class MyClass : public IMyInterface
{
public:void myMethod() override {std::cout << "MyClass::myMethod called" << std::endl;}
};
/// <summary>
/// 指针传递:传递抽象类的实例的指针
/// </summary>
/// <param name="interfacePtr"></param>
void doSomething1(IMyInterface* interfacePtr) {interfacePtr->myMethod();
}/// <summary>
/// 错误用法,不允许使用抽象类类型作为函数参数,也就是说不能实例化。
/// </summary>
/// <param name="interfacePtr"></param>
//void doSomething2(IMyInterface interfacePtr) {
// interfacePtr.myMethod();
//}/// <summary>
/// 引用传递 需要传递抽象类的实例对象的引用.
/// </summary>
/// <param name="interfacePtr"></param>
void doSomething3(IMyInterface &interfacePtr) {interfacePtr.myMethod();
}/// <summary>
/// 对象的指针传递
/// </summary>
/// <param name="pMyCalss"></param>
void doSomething4(MyClass* pMyCalss) {pMyCalss->myMethod();
}/// <summary>
/// 值传递:会创建myObj的副本
/// </summary>
/// <param name="myObj"></param>
void doSomething5(MyClass myObj) {myObj.myMethod();
}/// <summary>
/// 引用传递:直接操作原始对象
/// </summary>
/// <param name="myObj"></param>
void doSomething6(MyClass &myObj) {myObj.myMethod();
}int main() {MyClass obj;IMyInterface* pMyInterface = &obj;doSomething1(pMyInterface);//doSomething2(obj); 错误用法doSomething3(*pMyInterface);doSomething4(&obj); doSomething5(obj); doSomething6(obj);return 0;
}
1.抽象类(接口)的实例的指针传递
/// <summary>
/// 指针传递:传递抽象类的实例的指针
/// </summary>
/// <param name="interfacePtr"></param>
void doSomething1(IMyInterface* interfacePtr) {interfacePtr->myMethod();
}int main() {MyClass obj;IMyInterface* pMyInterface = &obj;doSomething1(&obj);doSomething1(pMyInterface);return 0;
}
将抽象类指针作为函数参数传递。这允许函数接受任何实现了抽象类接口的类的实例。
2.抽象类(接口)的实例值传递(错误用法)
/// <summary>
/// 编译时错误,抽象类不能被实例化,不允许使用抽象类类型作为函数参数,也就是说不能实例化。
/// </summary>
/// <param name="interfacePtr"></param>
//void doSomething2(IMyInterface interfacePtr) {
// interfacePtr.myMethod();
//}
抽象类不能被实例化,因此不能作为值传递给函数。
3.抽象类(接口)的实例的对象的引用传递
/// <summary>
/// 引用传递 需要传递抽象类的实例对象的引用.
/// </summary>
/// <param name="interfacePtr"></param>
void doSomething3(IMyInterface &interfacePtr) {interfacePtr.myMethod();
}int main() {MyClass obj;IMyInterface* pMyInterface = &obj;doSomething3(*pMyInterface);return 0;
}
将抽象类对象的引用作为函数参数传递。这允许函数直接访问和修改原始对象。
4.实例对象的指针传递
/// <summary>
/// 对象的指针传递
/// </summary>
/// <param name="pMyCalss"></param>
void doSomething4(MyClass* pMyCalss) {pMyCalss->myMethod();
}int main() {MyClass obj;IMyInterface* pMyInterface = &obj;doSomething4(&obj); return 0;
}
将具体类对象的指针作为函数参数传递。这允许函数接受任何实现了抽象类接口的类的实例。
5.实例对象的值传递
/// <summary>
/// 值传递:会创建myObj的副本
/// </summary>
/// <param name="myObj"></param>
void doSomething5(MyClass myObj) {myObj.myMethod();
}
int main() {MyClass obj;doSomething5(obj); return 0;
}
将具体类对象作为值传递给函数。这创建了一个对象的副本,因此函数内部对对象的修改不会影响原始对象。
6.实例对象的引用传递
/// <summary>
/// 引用传递:直接操作原始对象
/// </summary>
/// <param name="myObj"></param>
void doSomething6(MyClass &myObj) {myObj.myMethod();
}int main() {MyClass obj;doSomething6(obj);return 0;
}
将具体类对象的引用作为函数参数传递。这允许函数直接访问和修改原始对象。
三、注意事项
- 当传递接口指针时,确保指针指向的对象确实实现了该接口。
- 当传递类对象时,确保对象的状态不会因为函数的调用而受到影响,除非函数是类的成员函数。
- 引用参数可以避免拷贝对象,提高效率。
- 指针参数可以接受空指针,引用参数不能接受空引用。
- 通过接口指针或类对象的传递,可以编写出更加灵活和可扩展的代码。
相关文章:
C++开发基础之函数参数传递的几种类型
一、前言 在C中,接口指针或类对象的函数参数传递是一个常见的做法,特别是在需要支持多态或动态绑定时。这里将介绍如何传递接口指针或类对象作为函数参数。 二、函数参数传递的几种类型 抽象类(接口)的实例只能通过指针或引用传…...

使用memcache 和 redis 、 实现session 会话复制和保持
一、NoSQL介绍 NoSQL是对Not Only SQL、非传统关系型数据库的统称 NoSQL一词诞生于1998年,2009年这个词汇再次提出指非关系型、分布式、不提供ACID的数据库设计模式 随着互联网时代的数据爆发时增长、数据库技术发展的日新月异,要适应新的业务需求&am…...

Tomcat 优化
在目前流行的互联网架构中,Tomcat在目前的网络编程中是举足轻重的,由于Tomcat的运行依赖于JVM,从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM 和 Tomcat 自身调优两部分。 一、JVM组成 1. JVM 组成 JVM组成部分 类加载子系统: 使用Ja…...

如何将pdf文件换成3d模型?---模大狮模型网
PDF文件是一种广泛用于文档传输和共享的格式,但在某些情况下,我们可能希望将其中的内容转换为更具交互性和视觉效果的3D模型。本文将介绍如何将PDF文件转换为3D模型,为您展示实现这一想象的步骤。 选择合适的PDF文件: 首先&#…...
Docker 中快速构建 Redis Cluster 集群
Docker 中快速构建 Redis Cluster 集群 目录 前言环境准备 所需软件配置网络 构建 Redis Cluster 镜像 创建自定义 Dockerfile构建镜像 启动 Redis 节点容器 启动命令 配置 Redis Cluster 集群 创建 Redis 集群验证集群状态 总结 前言 Redis 是一个高性能的键值对数据库&am…...

C语言----杨辉三角
各位看官们好。学习到这里想必大家应该对C语言的了解也是很深刻的了吧。但是我们也不能忘记我们一起学习的知识啊。在我们以前学习C语言的时候我想大家应该都听说过杨辉三角吧。虽然我们把其中的规律找到那么这个代码就简单很多了。那么接下里我们就来讲讲杨辉三角。 首先我们先…...

FlaUI
FlaUI是一个基于微软UIAutomation技术(简称UIA)的.NET库,它主要用于对Windows应用程序(如Win32、WinForms、WPF、Store Apps等)进行自动化UI测试。FlaUI的前身是TestStack.White,由Roemer开发,旨…...
MySQL调优-01反范式化表设计
MySQL调优-01反范式化表设计 数据库设计三范式 第一范式(1NF)。确保数据库表的每一列都是不可分割的原子数据项,即列中不可包含数组、记录等非原子数据项;确保表中没有重复的属性或列,每个属性只出现一次,…...

74从零开始学Java之排序算法中的冒泡和选择排序
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们要想成为一个优秀的程序员,其实非常关键的一点就是要锻炼培养自己的编程思维,就好比一个狙击手,要通过大量的射击训练要用大量的子弹喂出来。同样的…...

【Qt问题】VS2019 Qt win32项目如何添加x64编译方式
往期回顾: 【Qt问题】Qt常用快捷键汇总-CSDN博客 【Qt问题】Qt Creator 如何链接第三方库-CSDN博客 【Qt问题】Qt 如何带参数启动外部进程-CSDN博客 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式 我们都知道vs2019在编译项目的时候是需要选择编译环境的&…...

LabVIEW换智能仿真三相电能表研制
LabVIEW换智能仿真三相电能表研制 在当前电力工业飞速发展的背景下,确保电能计量的准确性与公正性变得尤为重要。本文提出了一种基于LabVIEW和单片机技术,具有灵活状态切换功能的智能仿真三相电能表,旨在通过技术创新提高电能计量人员的培训…...

Python | Leetcode Python题解之第69题x的平方根
题目: 题解: class Solution:def mySqrt(self, x: int) -> int:if x 0:return 0C, x0 float(x), float(x)while True:xi 0.5 * (x0 C / x0)if abs(x0 - xi) < 1e-7:breakx0 xireturn int(x0)...
libhv http client vs cpr
libhv http client 和 cpr 的性能对比 libhv test code static void test_http_async(HttpClient* cli, int seq, int* resp_cnt) {auto req std::make_shared<HttpRequest>();req->method HTTP_GET;req->url "www.baidu.com";req->timeout 1…...

CTFHub-Web-文件上传
CTFHub-Web-文件上传-WP 一、无验证 1.编写一段PHP木马脚本 2.将编写好的木马进行上传 3.显示上传成功了 4.使用文件上传工具进行尝试 5.连接成功进入文件管理 6.上翻目录找到flag文件 7.打开文件查看flag 二、前端验证 1.制作payload进行上传发现不允许这种类型的文件上传 …...

笔记2:cifar10数据集获取及pytorch批量处理
(1)cifar10数据集预处理 CIFAR-10是一个广泛使用的图像数据集,它由10个类别的共60000张32x32彩色图像组成,每个类别有6000张图像。 CIFAR-10官网 以下为CIFAR-10数据集data_batch_*表示训练集数据,test_batch表示测试…...

FSD自动驾驶泛谈
特斯拉的FSD(Full-Self Driving,全自动驾驶)系统是特斯拉公司研发的一套完全自动驾驶系统。旨在最终实现车辆在多种驾驶环境下无需人类干预的自动驾驶能力。以下是对FSD系统的详细探讨: 系统概述 FSD是特斯拉的自动驾驶技术&…...
golang获取变量动态类型
类型断言:data.(Type) 类型断言是最常用的获取变量动态类型的方法之一。允许在运行时将接口值转换为其具体类型。 data 是一个接口类型的变量。 Type 是一个具体的类型。 这个表达式的含义是,如果 data 的底层值是 Type 类型,那么 value 将接…...

外企接受大龄程序员吗?
本人知乎账号同公众号:老胡聊Java,欢迎留言并咨询 亲身体会外企经历所见所闻,外企能接受大龄程序员。 1 大概是10年的时候,进一家知名外企,和我一起进的一位manager,后来听下来,年龄35…...
【DevOps】掌控云端:Google Cloud SDK 快速上手
一、Google Cloud SDK Google Cloud SDK (Software Development Kit) 是一组工具,包括 gcloud、gsutil 和 bq,用于通过命令行或自动化脚本访问和管理 Google Cloud 资源和服务。以下是 Cloud SDK 的详细介绍: 1、gcloud 命令行工具 gcloud 是 Cloud SDK 的核心组件,用于管理 …...

【Unity 踩坑系列】配置VScode环境Downloading the.NET Runtime Failed to download.NET 7.0.9installation timed out
1.问题描述 在最近使用Unity配置VScode开发环境时,总会出现以下的情况。(很多朋友其实本地已经自己安装好了.net环境 PS:可能各种版本.net 6.0 - .net 8.0都试过安装了 但就是会自动下载最新版本的.net ) Downloading the .NET Runtime. Downloading .NET versio…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...