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++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL