C++之make_unique、namespace、class类总结(二百四十二)

news2024/12/26 21:08:42

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之make_unique、namespace、class类用法。

2.make_unique、namespace和class类介绍

    1. make_unique:make_unique 是 C++14 中引入的一个函数模板,用于创建一个独占所有权的智能指针(std::unique_ptr)。它可以动态分配内存并初始化对象,并且在构造函数抛出异常时自动释放内存,从而避免了内存泄漏的风险。make_unique 函数接受构造函数参数并返回包含该对象的 unique_ptr。使用 make_unique 可以简化动态内存分配的过程,并提高代码的安全性。
    1. namespace:命名空间是一种将全局作用域分割为不同部分的机制,以避免命名冲突。命名空间可以包含变量、函数、类和其他命名空间。通过将相关的代码组织在命名空间中,可以更好地组织和管理代码。使用命名空间可以避免在较大的项目中发生名称冲突,并提高代码的可读性和可维护性。
    1. class类:在面向对象编程中,类是一种用户定义的数据类型,用于封装数据和方法。类将数据和相关的操作(方法)组合在一起,形成了一个对象的抽象表示。类通常用于建模现实世界的实体或概念,并提供了封装、继承和多态等特性。

    类的定义包含了成员变量和成员函数。成员变量用于存储对象的状态和属性,而成员函数用于操作和访问这些成员变量。通过实例化类的对象,可以调用对象的成员函数来处理数据和执行操作。

    类还可以通过访问限定符(publicprivateprotected)来控制成员的访问权限。public 成员可以从类的外部访问,private 成员只能在类的内部访问,而 protected 成员可以在类的派生类中访问。

  • 4.make_unique 用于安全地动态分配和初始化对象,命名空间提供了避免命名冲突的机制,类则用于建立对象的抽象模型,封装数据和相关操作。

3.实例

1. 在命名空间中使用 make_unique 创建一个类的实例:

namespace MyNamespace {
    class MyClass {
    public:
        MyClass() {
            std::cout << "MyClass constructor" << std::endl;
        }
    };
}

int main() {
    auto obj = std::make_unique<MyNamespace::MyClass>();
    // 输出: MyClass constructor
    return 0;
}

2. 在命名空间中使用 make_unique 创建一个类的实例,并传递构造函数参数:

namespace MyNamespace {
    class MyClass {
    public:
        MyClass(int value) : mValue(value) {
            std::cout << "MyClass constructor, value: " << mValue << std::endl;
        }

    private:
        int mValue;
    };
}

int main() {
    auto obj = std::make_unique<MyNamespace::MyClass>(42);
    // 输出: MyClass constructor, value: 42
    return 0;
}

3. 在命名空间中使用 make_unique 创建一个指向类对象数组的 unique_ptr

namespace MyNamespace {
    class Point {
    public:
        Point(int x, int y) : mX(x), mY(y) {}

        void print() {
            std::cout << "Point: (" << mX << ", " << mY << ")" << std::endl;
        }

    private:
        int mX;
        int mY;
    };
}

int main() {
    const int size = 5;
    auto points = std::make_unique<MyNamespace::Point[]>(size);

    for (int i = 0; i < size; ++i) {
        points[i] = MyNamespace::Point(i, i);
        points[i].print();
    }

    return 0;
}

4. 在命名空间中使用 make_unique 创建一个带有初始化列表的类对象:

namespace MyNamespace {
    class MyClass {
    public:
        MyClass(std::initializer_list<int> values) {
            std::cout << "MyClass constructor, values: ";
            for (const auto& value : values) {
                std::cout << value << " ";
            }
            std::cout << std::endl;
        }
    };
}

int main() {
    auto obj = std::make_unique<MyNamespace::MyClass>({1, 2, 3, 4});
    // 输出: MyClass constructor, values: 1 2 3 4
    return 0;
}

5. 创建一个带有命名空间和类的层级结构,在命名空间中使用 make_unique 创建类的实例:

namespace MyNamespace {
    namespace SubNamespace {
        class MyClass {
        public:
            MyClass() {
                std::cout << "MyClass constructor" << std::endl;
            }
        };
    }
}

int main() {
    auto obj = std::make_unique<MyNamespace::SubNamespace::MyClass>();
    // 输出: MyClass constructor
    return 0;
}

6. 在类的构造函数中使用 make_unique 创建类的成员对象:

class MyClass {
public:
    MyClass() : mPtr(std::make_unique<int>(42)) {}

private:
    std::unique_ptr<int> mPtr;
};

int main() {
    MyClass obj;
    return 0;
}

7. 在类的静态成员函数中使用 make_unique 创建类对象:

class MyClass {
public:
    static void createObject() {
        auto obj = std::make_unique<MyClass>();
    }
};

int main() {
    MyClass::createObject();
    return 0;
}

8.多层嵌套namespace命名空间 v1.0

#include <iostream>
#include <memory>
#include <string>

namespace android {
  namespace impl {
    class HWComposer {
    public:
      HWComposer(const std::string& serviceName)
        : mServiceName(serviceName) {
      }

      void printServiceName() {
	printf("xxx-------------->%s(), line = %d, ServiceName = %s\n",__FUNCTION__,__LINE__,mServiceName.c_str());
      }

    private:
      std::string mServiceName;
    };
  } // namespace impl
} // namespace android

int main() {
  std::string serviceName = "SurfaceFlinger";
  std::unique_ptr<android::impl::HWComposer> hwComposer  = std::make_unique<android::impl::HWComposer>(serviceName);
  hwComposer->printServiceName();

  return 0;
}

9.多层嵌套namespace命名空间 v2.0

#include <iostream>
#include <memory>
#include <string>

namespace android {
  namespace impl {
    class HWComposer {
    public:
      HWComposer(const std::string& serviceName)
        : mServiceName(serviceName) {
      }

      void printServiceName() {
	printf("xxx-------------->%s(), line = %d, ServiceName = %s\n",__FUNCTION__,__LINE__,mServiceName.c_str());	
      }

    private:
      std::string mServiceName;
    };
  } // namespace impl
} // namespace android


std::unique_ptr<android::impl::HWComposer> getinstance(std::string serviceName){
  return std::make_unique<android::impl::HWComposer>(serviceName);
}

int main() {
  std::string serviceName = "SurfaceFlinger";
  std::unique_ptr<android::impl::HWComposer> hwComposer  = getinstance(serviceName); 
  hwComposer->printServiceName();
  return 0;
}

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

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

相关文章

React-Router-6学习笔记

一、新建react项目 1、新建项目命令&#xff1a; yarn create vite react-router --template react 2、在vsCode中打开项目 3、在vsCode打开命令终端&#xff0c;输入 yarn 4、执行yarn dev启动当前项目 yarn dev 5、删除多余的东西&#xff0c;保留app.jsx和main.jsx文…

高校教务系统登录页面JS分析——皖西学院

高校教务系统密码加密逻辑及JS逆向 本文将介绍皖西学院教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密…

NLP算法面经 | 腾讯 VS 美团

作者 | 曾同学 编辑 | NewBeeNLP 面试锦囊之面经分享系列&#xff0c;持续更新中 后台回复『面试』加入讨论组交流噢 lz从3月初脚因打球扭伤了开始&#xff0c;投递简历&#xff0c;接二连三的面试鞭尸又面试&#xff0c;昨天才终于上岸了&#xff0c;分享经验~ 腾讯PCG看点&…

SSH 基础学习使用

什么是SSH 1.SSH SSH&#xff08;Secure Shell&#xff09; 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议&#xff0c;利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 实际应用中&#xff0c;主要用于保证远程登录和远程通信的安全&#…

数字技术助力智慧公厕,让公厕变身为全新创新应用

在如今数字化的时代&#xff0c;数字技术的集成应用已经渗透到了生活的方方面面。其中一个令人瞩目的领域就是智慧公厕。以前只是简单的厕所&#xff0c;如今借助数字技术的力量&#xff0c;智慧公厕变得功能强大、智能高效。接下来&#xff0c;我们将以智慧公厕源头领航厂家广…

Retrieve Anything To Augment Large Language Models

简介 论文主要介绍了一套通过对比学习和蒸馏学习的方法&#xff0c;来增强学习了embedding向量&#xff0c;然后能够在知识增强&#xff0c;长上下文建模&#xff0c;ICL和工具学习等方面来增强大模型能力。

计算机网络第一章补充整理(计算机网络体系结构)

前言&#xff1a;以下整理内容&#xff0c;参考《计算机网络自顶向下》和哈工大的计网慕课 目录 计算机网络的体系结构的一些概念为什么采用分层结构&#xff1f;分层结构的优点分层结构的缺点 开放系统互连&#xff08;OSI&#xff09;参考模型物理层功能数据链路层功能网络层…

大数据flink篇之三-flink运行环境安装后续一yarn-session安装

前提&#xff1a; Hadoop 必須保证在 2.2 以上&#xff0c;且必須裝有 hdfs 服务。Hadoop安装后续会有相关说明。 具体的&#xff0c;在生产环境中&#xff0c;flink一般会交由yarn、k8s等资源管理平台来处理。本章主要讲解yarn模式下的session cluster模式。 flink Session-C…

FPC柔性电路板介绍及PCB设计经验规则总结

🏡《总目录》 目录 1,概述2,FPC的特点3,FPC设计十五条经验规则4,总结1,概述 FPC软板由于具有可弯曲折叠的特点,当前在消费电子,汽车电子和航空航天领域应用广泛。本文详细介绍FPC的特点并对FPC板设计中需要注意的经验原则进行总结。 2,FPC的特点 FPC的全称是Flexibl…

Python实现带图形界面的计算器

Python实现带图形界面的计算器 在本文中&#xff0c;我们将使用Python编写一个带有图形用户界面的计算器程序。这个程序将允许用户通过点击按钮或键盘输入数字和操作符&#xff0c;并在显示屏上显示计算结果。 开发环境准备 要运行这个计算器程序&#xff0c;您需要安装Pyth…

数据链路层—以太网协议

数据链路层—以太网协议 文章目录 数据链路层—以太网协议重新认识四层模型以太网局域网特点以太网帧格式碰撞领域和避免碰撞算法认识MAC地址令牌环网交换机认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响数据跨网段传输的过程 重新认识四层模型 TCP/IP分层模型…

C# Convert和BitConverter类学习

前言&#xff1a; C# Convert是一个比较好用的强制转换&#xff0c;相比我们之前用的(int)或者是类型.Parse()&#xff0c;Convert给我们提供了很多的选项&#xff0c;特别是对于有字节要求的变量&#xff0c;Convert简直就是C#编程的福音&#xff0c;BitConvert对于byte数组转…

数据结构的奥秘:算法与实际应用的完美融合

文章目录 第一部分&#xff1a;数据结构的精髓1. 数组&#xff08;Array&#xff09;2. 链表&#xff08;Linked List&#xff09;3. 栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;4. 树&#xff08;Tree&#xff09;5. 图&#xff08;Graph&#xff09…

fastjson 1.2.47 远程命令执行漏洞

fastjson 1.2.47 远程命令执行漏洞 文章目录 fastjson 1.2.47 远程命令执行漏洞1 在线漏洞解读:2 环境搭建3 影响版本&#xff1a;4 漏洞复现4.1 访问页面4.2 bp抓包&#xff0c;修改参数 5 使用插件检测漏洞【FastjsonScan】5.1使用説明5.2 使用方法5.2.1 右键菜单中&#xff…

车载电子电器架构 —— 国产基础软件生态简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

python二次开发CATIA:测量曲线长度

以下代码是使用Python语言通过win32com库来控制CATIA应用程序的一个示例。主要步骤包括创建一个新的Part文件&#xff0c;然后在其中创建一个新的几何图形集&#xff0c;并在这个集合中创建一个样条线。这个样条线是通过一组给定的坐标点来创建的&#xff0c;这些点被添加到集合…

利用深度学习进行组水平大脑解码

摘要 脑成像数据解码越来越受欢迎&#xff0c;可用于脑机接口和神经表征等方面的研究。解码通常是特定于个体的&#xff0c;由于不同被试之间的差异较大&#xff0c;因而不能很好地泛化。克服这一问题的技术不仅需要能够提供更丰富的神经科学见解&#xff0c;而且还能使组水平…

Docker Compose命令讲解+文件编写

docker compose的用处是对 Docker 容器集群的快速编排。&#xff08;源码&#xff09; 一个 Dockerfile 可以定义一个单独的应用容器。但我们经常碰到需要多个容器相互配合来完成某项任务的情况&#xff08;如实现一个 Web 项目&#xff0c;需要服务器、数据库、redis等&#…

【Windows日志】记录系统事件的日志

文章目录 一、概要二、Windows日志介绍 2.1 应用程序日志2.2 系统日志2.3 安全日志 三、查看与分析日志四、常见事件ID 4.1 登录事件 4.1.1 4624登陆成功4.1.2 4625登陆失败 4.2 特权使用4.3 账户管理事件4.4 账户登录事件5.2 事件ID汇总 一、概要 Windows主要有以下三类日…

Nginx:反向代理(示意图+配置)

示意图&#xff1a; 反向代理 反向代理&#xff08;Reverse Proxy&#xff09;是代理服务器的一种&#xff0c;它代表服务器接收客户端的请求&#xff0c;并将这些请求转发到适当的服务器。当请求在后端服务器完成之后&#xff0c;反向代理搜集请求的响应并将其传输给客户端。…