C++之函数中实现类与调用总结(二百五十四)

news2024/11/23 19:25:41

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之函数中实现类与调用实例用法

2.在函数中实现类的作用

在C++中在函数中实现类可以具有多种作用,包括但不限于:

  1. 封装性和局部性:在函数中实现类可以将类的定义限制在函数的作用域内,从而保持类的封装性和局部性。这样可以避免在整个程序中暴露类的细节,使得类的实现对于其他部分来说是不可见的,从而保持代码的模块化和封装。

  2. 临时对象:在某些情况下,如果一个类只在一个函数中使用,将该类定义在函数中可以减少全局名称空间的污染,同时避免在整个项目中引入不必要的类定义。

  3. 内部实现细节隐藏:在函数中实现类可以将类的具体实现细节隐藏起来,只暴露对外部代码有意义的接口,从而提高代码的安全性和可维护性。

  4. 临时辅助类:有时候我们可能需要临时定义一些辅助类或者数据结构,在函数中定义这些类可以避免在整个项目中引入不必要的类定义。

  5. 模板函数内部类:在模板函数内部定义类可以提供更灵活的方式来处理模板函数的特化。

  6. 简化代码:在特定函数中定义类可以使代码更加紧凑和可读,因为相关的类定义直接与使用它们的代码放在一起。

虽然在函数中实现类可以带来一些好处,但需要注意的是这样做也可能会导致一些问题,比如难以维护、可读性下降、类的复用性下降等。因此,在实际开发中需要根据具体情况权衡利弊。

3.代码实例

1.在函数中定义类并创建类的实例:

#include <iostream>
using namespace std;

void useClassInFunction1() {
    class Person {
    public:
        string name;
        int age;
    };

    Person person1;
    person1.name = "Alice";
    person1.age = 30;
    cout << "Name: " << person1.name << ", Age: " << person1.age << endl;
}

int main() {
    useClassInFunction1();
    return 0;
}

2. 在函数中定义类并创建多个类的实例:

#include <iostream>
using namespace std;

void useClassInFunction2() {
    class Car {
    public:
        string brand;
        string model;
    };

    Car car1, car2;
    car1.brand = "Toyota";
    car1.model = "Corolla";
    car2.brand = "Honda";
    car2.model = "Civic";

    cout << car1.brand << " " << car1.model << endl;
    cout << car2.brand << " " << car2.model << endl;
}

int main() {
    useClassInFunction2();
    return 0;
}

3. 在函数中定义类并使用构造函数初始化类的实例:

#include <iostream>
using namespace std;

void useClassInFunction3() {
    class Rectangle {
    public:
        int width;
        int height;
        Rectangle(int w, int h) : width(w), height(h) {}
    };

    Rectangle rect(10, 5);
    cout << "Width: " << rect.width << ", Height: " << rect.height << endl;
}

int main() {
    useClassInFunction3();
    return 0;
}

4. 在函数中定义类并使用成员函数:

#include <iostream>
using namespace std;

void useClassInFunction4() {
    class Circle {
    public:
        double radius;
        double area() {
            return 3.14 * radius * radius;
        }
    };

    Circle circle;
    circle.radius = 5.0;
    cout << "Area of the circle: " << circle.area() << endl;
}

int main() {
    useClassInFunction4();
    return 0;
}

5. 在函数中定义类并使用静态成员:

#include <iostream>
using namespace std;

void useClassInFunction5() {
    class BankAccount {
    public:
        static double interestRate;
    };

    BankAccount::interestRate = 0.05;
    cout << "Interest rate: " << BankAccount::interestRate << endl;
}

int main() {
    useClassInFunction5();
    return 0;
}

6. 在函数中定义类并使用友元函数:

#include <iostream>
using namespace std;

void useClassInFunction6() {
    class Rectangle {
    private:
        int width, height;
    public:
        Rectangle(int w, int h) : width(w), height(h) {}
        friend void printArea(Rectangle rect);
    };

    void printArea(Rectangle rect) {
        cout << "Area: " << rect.width * rect.height << endl;
    }

    Rectangle rectangle(4, 5);
    printArea(rectangle);
}

int main() {
    useClassInFunction6();
    return 0;
}

7. 在函数中定义类并使用模板:

#include <iostream>
using namespace std;

template <class T>
void useClassInFunction7() {
    class Box {
    public:
        T data;
    };

    Box<int> intBox;
    intBox.data = 10;
    cout << "Data in intBox: " << intBox.data << endl;

    Box<string> strBox;
    strBox.data = "Hello";
    cout << "Data in strBox: " << strBox.data << endl;
}

int main() {
    useClassInFunction7();
    return 0;
}

8.在函数中定义静态成员函数

#include <iostream>
using namespace std;

void load_system_driver() {

  class MatchFile {
  public:
    static std::string find() {
      const char* const searchPaths[] = {
#if defined(__LP64__)
	"/vendor/lib64/egl",
	"/system/lib64/egl"
#else
	"/vendor/lib/egl",
	"/system/lib/egl"
#endif
      };

      std::string retbuf;
      for (auto dir : searchPaths) {
	printf("xxx--------------->%s, %s(), line = %d, dir = %s\n",__FILE__,__FUNCTION__,__LINE__,dir);
	retbuf.assign(dir);
      }
      return retbuf;
    }
  };

  std::string absolutePath = MatchFile::find();
  printf("xxx--------------->%s, %s(), line = %d, abs_path = %s\n",__FILE__,__FUNCTION__,__LINE__,absolutePath.c_str());
}

int main(){
  load_system_driver();
}

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

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

相关文章

SpringMVC使用AOP监听方法推送数据

导入aop的maven依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.12</version> </dependency>创建一个spring的XML文件编写aop配置 <?xml version"1.0" …

基于springboot的二次元商品销售网站的设计与开发

大家好我是玥沐春风&#xff0c;今天分享一个基于springboot的二次元商品销售网站的设计与开发&#xff0c;项目源码以及部署相关请联系我&#xff0c;文末附上联系信息 。 开发工具及技术 2.3.1 Spring Boot框架 SpringBoot是一个全新的开源的轻量级框架。简化了Spring应用的…

Linux中的权限

目录 一、shell命令以及运行原理 二、Linux权限的概念 三、权限的八进制表示 四、修改文件的拥有者和所属组 五、权限常见的问题 1、目录的权限 2、umask 3、粘滞位 一、shell命令以及运行原理 首先&#xff0c;我们先来看看这个问题&#xff1a;我们使用命令是直接操…

electron安装报错:Electron failed to install correctly...解决方案

问题描述&#xff1a; 按照官方文档在yarn dev时报错&#xff1a; 一般遇到Electron failed to install correctly&#xff0c;please delete node_moules/electron and try installing again这种错误时&#xff0c;就是electron本体没有下载成功 解决方案&#xff1a; 1、…

GaN HEMT 电容的分析建模,包括寄生元件

标题&#xff1a;Analytical Modeling of Capacitances for GaN HEMTs, Including Parasitic Components 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;14年&#xff09; 摘要&#xff1a;本文提出了一种基于表面势的终端电荷和电容模型&#xff0c;包…

Android 10.0 系统默认打开OEM解锁开关功能实现

1.前言 在10.0的系统定制中,在9.0系统以后为了设备的安装,系统开始启用oem机制,所以在adb push文件就需要先oem解锁,然后才可以 进行相关操作,所以就需要默认打开oem解锁的开关,来方便oem解锁功能的实现 如图: 2.系统默认打开OEM解锁开关功能实现的核心类 packages\ap…

【计算机网络笔记】网络层服务模型——虚电路网络

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【C++数据结构】线性表的本质和概念

文章目录 前言一、线性表的定义1.1 线性表的定义1.2 线性表的表现形式1.3 线性表 ( List ) 的抽象定义1.4 线性表的性质1.5 简单解释 二、生活中的线性表三、抽象实现线性表List3.1 线性表的本质和操作3.2 抽象实现 总结 前言 在计算机科学与数据结构领域&#xff0c;线性表是…

使用comicai绘制漫画

在bard中输入提示语&#xff1a; 再写一个关于校园爱情的漫画脚本&#xff0c;里面的角色要求都是人类&#xff0c;没有动物&#xff0c;简短&#xff0c;用英文 填写漫画标题和作者&#xff1a; 将bard生成的脚本如何框中&#xff1a; 选择并生成角色形象&#xff08;通过提示…

Docsify 和 Hugo 之间的选型

对文档的编译&#xff0c;目前的发布方案是越来越注重 MD 的编辑和发布。 针对其他 Wiki 的选择&#xff0c;MD 文件的编辑通常会保留修改记录&#xff0c;同时不依赖中央数据库和其他类型的 Web 应用服务。 随着各大云平台的支持&#xff0c;包括 GitHub Page 和 Google 的 …

时序预测 | MATLAB实现WOA-CNN-LSTM-Attention时间序列预测(SE注意力机制)

时序预测 | MATLAB实现WOA-CNN-LSTM-Attention时间序列预测&#xff08;SE注意力机制&#xff09; 目录 时序预测 | MATLAB实现WOA-CNN-LSTM-Attention时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述 1.MATLAB实…

AI:72-基于深度学习的火灾检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

【LeetCode刷题笔记】栈和队列

456. 132 模式 解题思路: 1. 单调递减栈,栈中存放的值当作 k 值,从右往左遍历数组,对于遇到的每一个元素 j 找最大的 k,遇到 nums[j] > 栈顶</

mysql explain type 枚举

explain 查看 sql 查询是否走索引。 其中 type 的枚举如下 类型说明system表只有一行&#xff08;系统表&#xff09;&#xff0c;这是 const 类型的特例const单表中的某个固定的值eq_ref使用唯一索引等值查找一个行ref使用非唯一索引查找所有匹配某个单个值的行fulltext使用…

如何摆脱自卑心理,自我提升和自我接纳是关键

自卑心理主要是由于缺乏对自己的客观评价&#xff0c;常常自我否定&#xff0c;缺乏自信心&#xff0c;不敢拿主意做决定&#xff0c;他们性格敏感&#xff0c;缺乏勇气&#xff0c;不敢发表自己的意见&#xff0c;总是将错误归结为自己不够好&#xff0c;不够努力等等。 适度…

多语言翻译软件 Mate Translate mac中文版特色功能

Mate Translate for Mac是一款多语言翻译软件&#xff0c;Mate Translate mac可以帮你翻译超过100种语言的单词和短语&#xff0c;使用文本到语音转换&#xff0c;并浏览历史上已经完成的翻译。你还可以使用Control S在弹出窗口中快速交换语言。 Mate Translate Mac版特色功能…

浅谈无线测温产品在马来西亚某配电项目的应用

摘要&#xff1a;配电系统是由多种配电设备和配电设施所组成的变换电压和直接向终端用户分配电能的一个电力网络系统。由于配电系统作为电力系统的一个环节直接面向终端用户&#xff0c;它的完善与否直接关系着广大用户的用电可靠性和用电质量&#xff0c;因而在电力系统中具有…

这些Mac视频格式转换神器,大赞666~

转换视频格式相信是很多朋友在平时工作和学习过程中的刚需&#xff0c;并且有很多人经常问小编这块的问题。 特别是一些使用Mac的朋友。 因此&#xff0c;小编今天就来给各位Mac用户安利几个好用的视频转换软件。 1、VideoProc VideoProc 功能强大&#xff0c;可以把视频甚…

适用于4D毫米波雷达的目标矩形框聚类

目录 一、前言 二、点云聚类分割 三、基于方位搜索L型拟合 四、评价准则之面积最小化 五、评价准则之贴合最大化 六、评价准则之方差最小化 一、前言 对于多线束雷达可以获取目标物体更全面的面貌,在道路中前向或角雷达可能无法获取目标车矩形框但可以扫到两边或者一边…

维控PLC——LX2N :编程口通讯协议

文章目录 说明通讯帧通讯命令字通讯数据地址维控 LX2N&#xff08;LX2V&#xff09;通讯协议举例 说明 该协议适用于维控LX2N系列PLC&#xff0c;关于维控 LX1S的协议在另一篇文章中描述。 通讯帧 通讯采用ASCII码&#xff0c;校验方式采用和校验。 请求帧格式:报文开始命令…