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

2023-10-14 11:28

本文主要是介绍C++之make_unique、namespace、class类总结(二百四十二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介: 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 constructorreturn 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: 42return 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 4return 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 constructorreturn 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 androidint 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 androidstd::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;
}

这篇关于C++之make_unique、namespace、class类总结(二百四十二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210176

相关文章

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)