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

C++ 形参是类的指针 class * 通过new的方式创建对象

当你在C++中使用类指针(class *)作为函数的形参,并通过 new 关键字创建对象时,这种用法确实会改变类对象的值。原因是你通过指针传递了对象的内存地址,而不是传递对象本身。这意味着在函数内部对对象的任何修改都会直接影响到原始对象。这种做法与值传递和引用传递有明显的区别。

你需要将一个指向类对象的指针传递给函数。这样的做法可以提高代码效率,因为在函数调用过程中不需要复制整个对象。这对于大型对象或者需要动态分配内存的对象尤为有用。

这种用法的优点和区别如下:

  1. 避免了拷贝成本:当你传递一个指针时,只需传递一个地址,而不需要拷贝整个对象。这对于大型对象尤其有利,因为它减少了内存消耗和计算时间。

  2. 动态内存分配:通过使用 new 关键字分配内存,你可以在运行时动态地创建对象。这使得程序在内存分配方面更加灵活。

  3. 修改原始对象:由于你传递的是对象的地址,所以在函数内部对对象所做的任何修改都会影响到原始对象。这在需要修改对象状态的情况下非常有用。

  4. 多态性:指针形参可以用于实现多态性。如果你有一个基类的指针,你可以使用它来指向派生类的对象。这使得你可以在运行时根据实际类型调用适当的函数。

与其他形参类型的区别:

  1. 值传递:通过值传递,函数接收对象的副本。这意味着在函数内部对对象进行的任何更改都不会影响到原始对象。这种方式在需要保护原始对象不被更改的情况下很有用,但会产生拷贝成本。

  2. 引用传递:通过引用传递,函数接收对象的引用。这意味着在函数内部对对象进行的任何更改都会影响到原始对象。引用传递与指针传递类似,但使用起来更加安全,因为引用不能为nullptr,且引用在创建时必须初始化。此外,使用引用的语法通常更简洁。

总之,使用类指针作为形参并通过 new 创建对象,可以实现动态内存分配和直接修改原始对象。这种方法与值传递和引用传递相比,在内存消耗和运行时灵活性方面具有优势。然而,使用指针可能会导致内存泄漏和空指针问题,因此需要谨慎使用。

以下是一个使用指向类对象的指针作为形参的例子:

我们可以通过new关键字创建一个对象并将其地址传递给该指针。

首先,定义一个类:

class MyClass {
public:int x;MyClass(int val) : x(val) {}void display() {std::cout << "The value of x is: " << x << std::endl;}
};

接下来,定义一个函数,该函数接受一个MyClass指针作为参数:

void foo(MyClass *obj) {obj->display();
}

现在,你可以在main函数中使用new关键字创建一个MyClass对象,并将其地址传递给foo函数:

int main() {MyClass *obj = new MyClass(10);foo(obj);// 当你不再需要对象时,记得使用 delete 释放内存delete obj;return 0;
}

在这个例子中,我们首先定义了一个名为MyClass的类。接下来,我们定义了一个名为foo的函数,它接受一个MyClass指针作为参数。在main函数中,我们使用new关键字创建了一个MyClass对象,并将其地址传递给了foo函数。最后,我们使用delete释放了对象占用的内存。

多态性是面向对象编程中的一个重要概念。在C++中,多态性是通过使用基类指针或引用来指向派生类对象实现的。这允许你在运行时根据实际对象类型调用适当的成员函数。多态性有两种主要形式:静态多态性(编译时多态性)和动态多态性(运行时多态性)。

  1. 静态多态性:静态多态性是通过模板和函数重载实现的。在编译时,编译器会根据提供的参数类型生成相应的函数。这种多态性的优点是性能较高,因为函数调用在编译时就已经确定。然而,它的缺点是缺乏灵活性,因为所有可能的函数版本都需要在编译时生成。

  2. 动态多态性:动态多态性是通过使用虚函数实现的。虚函数允许你在基类中声明一个成员函数,然后在派生类中覆盖该函数。通过使用基类指针或引用来指向派生类对象,你可以在运行时调用适当的函数版本。这种多态性的优点是更高的灵活性,因为函数调用是在运行时确定的。然而,它的缺点是性能较低,因为函数调用需要通过虚函数表(vtable)来查找。

以下是一个简单的C++动态多态性示例:

#include <iostream>// 基类
class Animal {
public:virtual void makeSound() {std::cout << "The animal makes a sound" << std::endl;}
};// 派生类 1
class Dog : public Animal {
public:void makeSound() override {std::cout << "The dog barks" << std::endl;}
};// 派生类 2
class Cat : public Animal {
public:void makeSound() override {std::cout << "The cat meows" << std::endl;}
};void playSound(Animal& animal) {animal.makeSound();
}int main() {Dog dog;Cat cat;playSound(dog);  // 输出:The dog barksplaySound(cat);  // 输出:The cat meowsreturn 0;
}

在这个例子中,Animal 是基类,包含一个虚函数 makeSound()。派生类 DogCat 分别覆盖了基类的 makeSound() 函数。playSound() 函数接受一个 Animal 类型的引用参数。当我们分别传递 DogCat 对象时,playSound() 函数会根据实际类型调用适当的 makeSound() 函数。

通过使用多态性,你可以更灵活地设计和实现代码,使得程序更容易扩展和维护。

相关文章:

C++ 形参是类的指针 class * 通过new的方式创建对象

当你在C中使用类指针&#xff08;class *&#xff09;作为函数的形参&#xff0c;并通过 new 关键字创建对象时&#xff0c;这种用法确实会改变类对象的值。原因是你通过指针传递了对象的内存地址&#xff0c;而不是传递对象本身。这意味着在函数内部对对象的任何修改都会直接影…...

手把手教你将项目部署到服务器!

一、导入centos7虚拟机&#xff1a; 打开VMWare&#xff0c;点击“打开虚拟机”&#xff0c;选择centos7.ova之后&#xff0c;选择存储路径&#xff1a; 点击导入&#xff1a; 选择“不再显示此消息”&#xff0c;点击“重试”按钮&#xff1a; 点击“编辑虚拟机设置”&#x…...

OpenHarmony应用开发-ArkUI方舟开发框架简析

方舟开发框架&#xff08;简称ArkUI&#xff09;为OpenHarmony应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界…...

【Transformer系列(4)】Transformer模型结构超详细解读

前言 前一篇我们一起读了Transformer的论文《Attention Is All You Need》&#xff0c;不知道大家是否真的理解这个传说中的神&#xff08;反正俺是没有~&#xff09; 这两天我又看了一些视频讲解&#xff0c;感谢各位大佬的解读&#xff0c;让我通透了不少。 这篇文章就和…...

Idea启动运行报错:Error:java: 无效的源发行版: 13

最近在做Springboot项目时&#xff0c;常常出现上述错误&#xff0c;小编也不知道怎么回事&#xff0c;到网上找了这个方面的解决办法&#xff0c;但是却发现根本解决不了&#xff0c;最终通过小编多次尝试&#xff0c;终于发现&#xff0c;为什么会报这个错误。(应该是Java版本…...

【元分析研究方法】学习笔记1.形成问题

步骤1 形成问题 该步骤的作用该步骤中需要注意的问题该步骤中部分知识点我的收获 参考来源&#xff1a;库珀 (Cooper, H. M. )., 李超平, & 张昱城. (2020). 元分析研究方法: A step-by step approach. 中国人民大学出版社. 这章内容很简单&#xff1a;①变量的刻画&#x…...

2023年3月 青少年软件编程(Python) 等级考试试卷(五级)

一、单选题(共25题&#xff0c;共50分) 1.已知一个列表lst [2,3,4,5,6]&#xff0c;lst.append(20)&#xff0c;print(lst)的结果是&#xff1f;&#xff08;C&#xff09;&#xff08;2分&#xff09; A.[10,2,3,4,5,6,20] B.[20,2,10,3,4,5,6] C.[2,3,4,5,6,20] D.[2,3,4,5,…...

必须要知道的hive调优知识(上)

Hive数据倾斜以及解决方案 1、什么是数据倾斜 数据倾斜主要表现在&#xff0c;map/reduce程序执行时&#xff0c;reduce节点大部分执行完毕&#xff0c;但是有一个或者几个reduce节点运行很慢&#xff0c;导致整个程序的处理时间很长&#xff0c;这是因为某一个key的条数比其…...

什么是Cache Aside Pattern与延迟双删

Cache Aside Pattern是一种常用的缓存设计模式&#xff0c;用于在应用程序中使用缓存提高系统性能的同时&#xff0c;避免缓存与数据库数据不一致的情况出现。延迟双删是Cache Aside Pattern的一种优化&#xff0c;可以进一步提高系统性能。 以下是关于Cache Aside Pattern和延…...

frp 流量特征

frp 流量特征 非常明显的明文流量特征...

Unity --- UGUI(Unity Graphical user interface)--- Canvas画布

1.UI --- User Interface --- 使用者与机器之间的交互界面 1.所谓的自适应系统指的是分辨率的适应&#xff1a; 比如在一个分辨率下做的UI放到另一个分辨率下显示时&#xff0c;如果没有自适应系统的话就会导致UI过大&#xff0c;过小&#xff0c;被辟成一半等等情况&#xff…...

c++积累6-内联函数

1、说明 内联函数是c为提高程序运行速度所做的一项改进。 2、常规函数运行 编译的可执行程序&#xff1a;由一组机器语言指令组成。 程序执行&#xff1a; 1、操作系统将这些指令载入到内存&#xff0c;每条指令都有一个特定的内存地址 2、计算机逐步执行这些指令 3、如果有…...

ESP32学习笔记13-MCPWM主要用于无刷电机驱动

16.MCPWM 16.1概述 ESP32 有两个 MCPWM 单元,可用于控制不同类型的电机。每个单元都有三对PWM输出 每个 A/B 对可由三个定时器定时器 0、1 和 2 中的任何一个计时。 同一定时器可用于为多对PWM输出提供时钟。 每个单元还能够收集输入,例如,检测电机过电流或过电压,以及获得…...

MyBatis-plu 和 JPA 对比

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MyBatis-plu 和 JPA 前言一、说下相同点二、差异点一、从实现来说&#xff1a;CURD实现方式不一样二、分页上三、雪花id四、伪删除五、子类排除父类的字段 总结 前言 提示&…...

一文详解Python中多进程和进程池的使用方法

这篇文章将介绍Python中多进程和进程池的使用方法&#xff0c;并提供一些实用的案例供大家参考&#xff0c;文中的示例代码讲解详细&#xff0c;感兴趣的小伙伴可以了解一下 目录 Python是一种高级编程语言&#xff0c;它在众多编程语言中&#xff0c;拥有极高的人气和使用率。…...

前端部署发布项目后,如何通知用户刷新页面、清除缓存

以下只是一些思路&#xff0c;有更好的实现方式可以留言一起交流学习 方式一&#xff1a;纯前端 在每次发布前端时&#xff0c;使用webpack构建命令生成一个json文件&#xff0c;json中写个随机生成的一个字符串&#xff08;比如时间戳&#xff09;&#xff0c;每次打包程序都…...

项目上线|慕尚集团携手盖雅工场,用数字化推动人效持续提升

过去十年&#xff0c;中国零售业以前所未有的速度被颠覆、被重塑&#xff0c;数字化则是其中重要的推动要素。 随着数字化转型的深入&#xff0c;零售企业的数字化不再局限于布局线上渠道&#xff0c;且更关乎其背后企业核心运营能力的全链路数字化改造。而贯穿于运营全链路的…...

Java重载 与封装、继承

方法重载 在同一个类中&#xff0c;出现了方法名相同&#xff0c;参数不同的方法时 &#xff0c;我们叫方法重载 作用&#xff1a;根据不同参数&#xff0c;选择不同方法 实例 public static void main(String[] args){public int add(int a,int b){return ab;}public double…...

sed正则表达式替换字符方法

在 Linux 命令行中&#xff0c;可以使用 sed 命令来替换指定文件中的指定字符。具体方法如下&#xff1a; sed -i s/<old_string>/<new_string>/g <filename>其中&#xff0c;<old_string> 表示要被替换的字符串&#xff0c;<new_string> 表示替…...

不讲废话普通人了解 ChatGPT——基础篇第一课

wx供重浩&#xff1a;创享日记 获取更多内容 文章目录 前言什么是 ChatGPT它是如何工作的ChatGPT 和其它机器人有什么不同 前言 不知道大家在第一次会使用 ChatGPT 并尝试和他对话时有没有感到震惊。当ChatGPT首次推出时&#xff0c;我立即被它的功能所吸引。 曾经在遇到繁杂…...

树莓派GPIO排针焊接与外壳组装全攻略:从焊接技巧到机械装配

1. 项目概述与核心价值如果你手头有一块树莓派&#xff0c;并且打算用它来驱动一个像Joy Bonnet这样的游戏手柄扩展板&#xff0c;或者任何其他需要直接插在GPIO排针上的HAT&#xff08;硬件附加板&#xff09;&#xff0c;那么你迟早会面临一个非常具体且有点“劝退”的硬件关…...

YouTube 视频翻译中文:基于 Whisper + FFmpeg 的自动化流水线实战

一、背景 YouTube 视频翻译中文&#xff0c;本质上是将外语视频通过语音识别&#xff08;ASR&#xff09;、文本翻译&#xff08;NMT&#xff09;、语音合成&#xff08;TTS&#xff09;三个环节处理后&#xff0c;重新合成为中文版本。每一个环节都有成熟的开源工具链支持&am…...

SLAM_TOOLBOX实战:从零到一构建长期可用的2D地图

1. SLAM_TOOLBOX入门&#xff1a;为什么选择它来构建2D地图&#xff1f; 第一次接触SLAM技术时&#xff0c;我被各种开源工具搞得眼花缭乱。直到在真实机器人项目里用了SLAM_TOOLBOX&#xff0c;才发现它简直是长期建图的"瑞士军刀"。这个基于ROS的工具包最打动我的地…...

Prometheus外置抓取器:扩展监控能力与复杂场景适配方案

1. 项目概述&#xff1a;一个为Prometheus量身定制的“数据抓取器”如果你正在使用Prometheus监控你的微服务、Kubernetes集群或者任何需要被度量的系统&#xff0c;那你一定对scrape_configs这个配置项不陌生。Prometheus的核心工作模式就是“拉取”&#xff08;Pull&#xff…...

Linux内核模块多文件编译:从Kbuild原理到工程实践

1. 项目概述&#xff1a;从单文件到多文件内核模块的进阶之路搞内核模块开发的朋友&#xff0c;估计都是从经典的“Hello World”单文件模块开始的。一个hello.c&#xff0c;配上几行简单的Makefile&#xff0c;insmod一下看到打印信息&#xff0c;成就感就来了。但当你真正想干…...

QuickRecorder终极指南:macOS上最轻量高效的专业录屏工具

QuickRecorder终极指南&#xff1a;macOS上最轻量高效的专业录屏工具 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHub_…...

GitHub中文界面极速解锁指南:5分钟告别英文困扰的终极方案

GitHub中文界面极速解锁指南&#xff1a;5分钟告别英文困扰的终极方案 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否曾经面对…...

从CTF逆向到软件分析:用z3-solver自动化求解约束方程

1. 为什么我们需要z3-solver&#xff1f; 第一次参加CTF比赛时&#xff0c;我遇到一道逆向题&#xff0c;需要解一个包含30多个变量的方程组。当时我花了整整两天时间手工计算&#xff0c;最后还是没能解出来。赛后才知道&#xff0c;原来可以用z3-solver在几分钟内自动求解。这…...

电商客服机器人如何通过 Taotoken 动态选择性价比最优的模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 电商客服机器人如何通过 Taotoken 动态选择性价比最优的模型 在电商客服场景中&#xff0c;用户咨询的问题复杂度差异巨大。从简单…...

一键永久放开权限(神州网信政府版专用)普通用户 安装软件的权限

一键永久放开权限&#xff08;神州网信政府版专用&#xff09; 第一步&#xff1a;先登录Administrator超级管理员 WinR 输入 netplwiz 回车勾选要使用本机&#xff0c;用户必须输入用户名和密码选中 Administrator 设为默认&#xff0c;注销重登进这个账号 第二步&#xff1a;…...