智能指针
unique_ptr
独占资源所有权的指针。由于没有引用计数,因此性能较好。
离开 unique_ptr 对象的作用域时,会自动释放资源。
unique_ptr 本质是一个类,将复制构造函数和赋值构造函数声明为 delete 就可以实现独占式,只允许移动构造和移动赋值。unique_ptr 所持有的对象只能通过 转移语义(move) 将所有权转移到另外一个 unique_ptr 。
123// 自定义实现 unique_ptrUniquePtr(UniquePtr<T> const &) = delete;UniquePtr & operator=(UniquePtr<T> const &) = delete;
123std::unique_ptr<int> uptr = std::make_unique<int>(200);// ...// 离开 uptr 的作用域的时候自动释放内存
std::unique_ptr 是 move-only 的。
12345std::unique_ptr<int> ...
左值、右值、纯右值、将亡值
左值、右值、纯右值、将亡值
C++11使用下面两种独立的性质来区别类别:
拥有身份:指代某个非临时对象。
可被移动:可被右值引用类型匹配。
每个C++表达式只属于三种基本值类别中的一种:左值 (lvalue)、纯右值 (prvalue)、将亡值 (xvalue)
拥有身份且不可被移动的表达式被称作 左值 (lvalue) 表达式,指持久存在的对象或类型为左值引用类型的返还值。
拥有身份且可被移动的表达式被称作 将亡值 (xvalue) 表达式,一般是指类型为右值引用类型的返还值。
不拥有身份且可被移动的表达式被称作 纯右值 (prvalue) 表达式,也就是指纯粹的临时值(即使指代的对象是持久存在的)。
不拥有身份且不可被移动的表达式无法使用。
如此分类是因为移动语义的出现,需要对类别重新规范说明。例如不能简单定义说右值就是临时值(因为也可能是 std::move 过的对象,该代指对象并不一定是临时值)。
左值
左值是一个数据的表达式(如变量名或引用的指针),我们可以获取到它的地址,正常情况下是可以能够对它赋值
定义const修饰后的左值,不能给它赋值,但是可以取出它的地址
...
数字大写转换
该算法未经过大量数据验证!!!
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include <iostream>#include <string>using namespace std;string chinese[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};string bit[] = {"", "十", "百", "千"};string GetChinese(string num){ ...
手撕队列(queue)
手撕队列(基于数组)
关键点在于头指针和尾指针在队列清空时的调整(MyQueue::pop()),不当的操作可能导致清空后的空间无法重复使用,不断扩容。
可对扩容操作(MyQueue::push())做进一步优化(数据前移)。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100#include<iostream>using namespace std;template <typename T>class MyQueue{private: T* _data; int _front; int _rear; int _size; int _capacity;public: MyQueue(); ...
const 与 static
const 与 static 关键字const
const修饰符用来定义常量,具有不可变性。在类中,被const修饰的成员函数,不能修改类中的数据成员;
指针常量指的是该指针本身是一个常量,不能被修改,但是指针指向的对象可以被修改;
常量指针指的是这个指针指向的对象是一个常量,不能被修改,但是指针本身可以被修改。
如果 const 变量是在全局作用域中声明的,它将存储在静态存储区(Static Storage Area)中。
如果 const 变量是在函数内部或代码块内部声明的,它将存储在栈(Stack)上,在函数返回时释放。
const 修饰的字符串常量存储在常量存储区,在程序运行期间保持不变。
const 修饰的函数能否重载?
const修饰的函数可以重载。const成员函数既不能改变类内的数据成员,也无法调用非const的成员函数;const类对象只能调用const成员函数。非const对象无论是否是const成员函数都能调用,但是如果有重载的非const函数,非const对象会优先调用重载后的非const函数。
const 修饰函数的参数
如果参数作输出用,不论它是什么数据 ...
碎玉零珠———— C++
volatile
volatile 是 C 语言中的一个关键字,用于修饰变量,表示该变量的值可能在任何时候被外部因素更改,例如 硬件设备、操作系统 或 其他线程 。
当一个变量被声明为 volatile 时,编译器会禁止对该变量进行优化,以确保每次访问变量时都会从内存中读取其值,而不是从寄存器或缓存中读取。避免因为编译器优化而导致出现不符合预期的结果。
explicit
在 C++ 中,explicit 通常用于构造函数的声明中,用于防止隐式转换。 当将一个参数传递给构造函数时,如果构造函数声明中使用了 explicit 关键字,则只能使用显式转换进行转换,而不能进行隐式转换。这种机制可以防止编译器自动执行预期外的类型转换,提高代码的安全性。
什么是隐式类型转化
当你只有一个类型T1,但是当前表达式需要类型为T2的值,如果这时候T1自动转换为了T2,那么这就是隐式类型转换。如下:
1234567int a = 0;long b = a + 1; // int 转换为 long if (a == b) { // 默认的operator==需要a的类型和b相同,因此也 ...