随笔分类 - C++代码块
摘要:在 C++ 中,关键字 virtual 用于修饰成员函数,使其成为虚函数,从而支持多态特性。多态是面向对象编程的核心特性之一,允许基类的指针或引用在运行时调用派生类中重写的函数。 1. 基本功能 当一个成员函数被声明为 virtual 时: 即使通过基类的指针或引用调用该函数,实际调用的函数是派生类
阅读全文
摘要:explicit operator int() const { return 42; } 是一个显式类型转换运算符,用于将当前对象转换为 int 类型。 1. 类型转换运算符的作用 在 C++ 中,类型转换运算符允许用户定义从自定义类到其他类型(如基本类型、用户定义类型)的转换规则。它的语法如下:
阅读全文
摘要:在 C++ 中,关键字 explicit 用于修饰类的构造函数,防止隐式类型转换的发生。使用 explicit 的原因和好处如下: 1. 防止隐式类型转换导致意外行为 当类的构造函数可以接受一个参数时,C++ 会自动将这种构造函数视为 转换构造函数,允许从参数类型隐式地转换为类类型。这种隐式转换有时
阅读全文
摘要:使用宏和使用方法在功能实现、代码管理、以及性能等方面有显著区别。以下是它们的主要差异: 1. 定义和应用范围 宏 宏通过预处理器指令(如 #define)定义,在编译之前由预处理器直接进行替换。 宏可以是常量(例如 #define PI 3.14)或代码块(例如 #define SQUARE(x)
阅读全文
摘要:在 C++ 中,未初始化的局部变量(如 int i)会包含未定义的值,可能导致未定义行为(undefined behavior, UB)。对于以下代码: for (int i; i < track_object.region_num; i++) { // Loop body } i 没有显式初始化,
阅读全文
摘要:在 C++ 中,可以使用多种方法将 float 类型转换为 std::string 类型。以下是常用的几种方法: 方法 1:std::to_string (C++11及以上) 这是最简单的方法之一,直接使用 std::to_string。 #include <iostream> #include <
阅读全文
摘要:随机裁剪尺寸 (x, y, w, h),其中裁剪区域的宽度和高度不能超过 640 和 360,保证裁剪的宽度和高度 ( w ) 和 ( h ) 是 2 的倍数 代码 #include <iostream> #include <cstdlib> // For rand() and srand() #i
阅读全文
摘要:在 C++ 中,直接打印枚举的名称并不容易,因为枚举本质上是整数类型,编译后的程序不会保存枚举名称的字符串形式。但是,有一些方法可以实现这个功能。 方法 1:手动映射(常用方法) 使用一个映射表或 switch 语句,将枚举值与其对应的名称关联起来。 #include <iostream> #inc
阅读全文
摘要:在 C++ 中,是否会在作用域结束后自动释放内存,取决于内存的分配方式: 1. 栈内存分配 如果变量是在 栈(stack)上分配的,那么当变量超出其作用域时,内存会自动释放。 示例:栈上分配 #include <iostream> using namespace std; void func() {
阅读全文
摘要:在 C++ 中,如果两个变量(a 和 b)指向同一段内存,并且其中一个变量(如 b)释放了这段内存,那么这段内存就被标记为可供系统重用的空闲内存。此时另一个变量(a)依然保留原有的指针,但它指向的内存已经被释放,成为 悬空指针(dangling pointer)。 关键问题 内存释放后的行为 如果
阅读全文
摘要:点击菜单栏的 File -> Settings->Editor -> Live Templates 点击 Define,选择 C++。 点击Apply 和 OK 保存。 当我们sout时,自动出现打印语句。
阅读全文
摘要:1. static 变量的初始化与赋值 static 变量在 C++ 中有一个特别的性质:它们在程序的生命周期内只会被初始化一次,但之后可以继续对其进行赋值。 初始化:static 变量在程序的初始化阶段(即程序第一次执行时)会被初始化一次。如果是局部 static 变量,则它会在第一次执行到该变量
阅读全文
摘要:类的析构函数会自动调用。析构函数是在对象的生命周期结束时由系统自动调用的特殊成员函数,主要用于释放对象占用的资源,执行清理工作。 具体情况 自动调用的时机: 局部对象:当对象离开其作用域时,析构函数会自动调用。 #include <iostream> class MyClass { public:
阅读全文
摘要:reinterpret_cast 是 C++ 中的一种强制类型转换运算符,用于在不同类型之间进行低级的指针或引用转换。与其他类型转换(如 static_cast 和 dynamic_cast)不同,reinterpret_cast 允许你进行更底层、更危险的转换,它直接将一个类型的位模式重新解释为另
阅读全文
摘要:static_cast<uint8_t*> 是一个 C++ 中的类型转换表达式,它将一个表达式转换为指定的指针类型 uint8_t*。以下是详细说明: 1. static_cast 的作用 static_cast 是一种在编译时执行的显式类型转换操作,适用于以下几种转换场景: 基本类型之间的转换(如
阅读全文
摘要:智能指针的初始化方式根据智能指针的类型(如 std::shared_ptr 或 std::unique_ptr)以及具体需求而有所不同。以下是详细介绍: 1. 初始化 std::shared_ptr std::shared_ptr 是一种引用计数智能指针,允许多个 shared_ptr 共享同一块内
阅读全文
摘要:智能指针和普通指针在使用方式上有相似之处,但也存在关键的区别。以下是对比与细节解析: 1. 相似点 智能指针在行为上模拟普通指针,因此某些使用方式相同: (1)指向对象 智能指针和普通指针都可以指向动态分配的对象: // 普通指针 int* rawPtr = new int(10); // 智能指针
阅读全文
摘要:在编程中,单实例(Singleton)模式和使用 static 变量或方法 都能实现某些程度上的共享状态或限制实例数量,但它们的设计目的、适用场景以及实现方式存在本质区别。 1. 单实例(Singleton)模式 特点: 目标:确保一个类在全局范围内只有一个实例,并提供一个访问该实例的全局访问点。
阅读全文
摘要:NULL 和 nullptr 都是用于表示空指针的常量,但它们在 C++ 中有一些重要的区别,特别是随着 C++11 引入了 nullptr 之后,nullptr 成为了更推荐的选择。以下是两者的主要区别: 1. 类型 NULL:在 C 和 C++ 中,NULL 是一个宏,通常定义为 0(或 (vo
阅读全文
摘要:在 C++ 中,结构体(struct)是用于组合多个变量(可以是不同类型)的数据类型。以下是创建结构体并赋值的基本方法: 1. 定义结构体并赋值 示例代码: #include <iostream> #include <string> using namespace std; // 定义结构体 str
阅读全文