当前位置: 首页 > news >正文

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

将具体类对象的引用作为函数参数传递。这允许函数直接访问和修改原始对象。

三、注意事项

  • 当传递接口指针时,确保指针指向的对象确实实现了该接口。
  • 当传递类对象时,确保对象的状态不会因为函数的调用而受到影响,除非函数是类的成员函数。
  • 引用参数可以避免拷贝对象,提高效率。
  • 指针参数可以接受空指针,引用参数不能接受空引用。
  • 通过接口指针或类对象的传递,可以编写出更加灵活和可扩展的代码。
http://www.lryc.cn/news/343844.html

相关文章:

  • 使用memcache 和 redis 、 实现session 会话复制和保持
  • Tomcat 优化
  • 如何将pdf文件换成3d模型?---模大狮模型网
  • Docker 中快速构建 Redis Cluster 集群
  • C语言----杨辉三角
  • FlaUI
  • MySQL调优-01反范式化表设计
  • 74从零开始学Java之排序算法中的冒泡和选择排序
  • 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式
  • LabVIEW换智能仿真三相电能表研制
  • Python | Leetcode Python题解之第69题x的平方根
  • libhv http client vs cpr
  • CTFHub-Web-文件上传
  • 笔记2:cifar10数据集获取及pytorch批量处理
  • FSD自动驾驶泛谈
  • golang获取变量动态类型
  • 外企接受大龄程序员吗?
  • 【DevOps】掌控云端:Google Cloud SDK 快速上手
  • 【Unity 踩坑系列】配置VScode环境Downloading the.NET Runtime Failed to download.NET 7.0.9installation timed out
  • 深入了解 NumPy:深度学习中的数学运算利器
  • 鸿蒙开发接口Ability框架:【@ohos.ability.particleAbility (particleAbility模块)】
  • Flutter笔记:Widgets Easier组件库(8)使用图片
  • 商务分析方法与工具(五):Python的趣味快捷-文件和文件夹操作自动化
  • codeforce#938 (div3) 题解
  • 【Docker】如何注册Hub账号并上传镜像到Hub仓库
  • [初阶数据结构】单链表
  • 项目使用git开发流程
  • Day 28 MySQL的数据备份与恢复
  • PackageKit的使用(三)疑问篇
  • 【Linux】17. 进程间通信 --- 管道