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

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque