C++
helpdoc
这个作者很懒,什么都没留下…
展开
-
C++实现根据字符串创建对象
使用std::map容器实现根据字符串创建对象原创 2022-02-08 10:01:25 · 1148 阅读 · 1 评论 -
C++间接释放内存造成野指针解决方法
// 考虑这种情况:通过指针赋值释放掉内存,再去解引用原始指针会怎么样int main(){ int* ptr = new int(1); int* pint = ptr; delete pint; pint = nullptr; if (ptr) { cout<<*ptr<<endl; // 使用野指针,其结果是不明确的...原创 2019-04-20 11:48:05 · 286 阅读 · 0 评论 -
C++11 NullablePointer
1、一种类似于指针的类,可以和std::nullptr_t对象比较2、满足: 相等比较(operator==) 默认构造 copy构造 copy赋值 析构 可以作为bool条件表达式使用。空值返回false,否则返回true 不抛出异常class nullPointer final{public: nullPointer(con...翻译 2019-05-05 01:41:04 · 235 阅读 · 0 评论 -
C++模板的几种写法
常规:tempate<class T>struct SName1{// statement};template<typename T>struct SName2{// statement};// 函数模板template<typename>void func(const T&){// statement}// ...原创 2019-05-05 22:53:59 · 1046 阅读 · 0 评论 -
如何理解深拷贝和浅拷贝
首先我们先记住一个结论:编译器自动生成的拷贝构造和赋值运算符是memcpy的一个过程。实例过程以结构体代替,在c++中struct和class除了默认访问权限基本等同。struct TestStruct1{ int arr[3]; int a;};int main(){ TestStruct1 oneVar; oneVar.arr[0]=1; ...原创 2019-04-30 23:06:37 · 346 阅读 · 0 评论 -
C++ 非const成员函数调用const成员函数的重载版本
在C++中void func() const 和void func()可以形成重载函数,如果void func() const和void func()写同样的代码实现func功能,这样就造成了代码浪费(重复写代码)。这种问题的解决方式就是利用static_cast达到代码复用的目的(重复利用代码)。下面给出一个转换过程:// 实例只是为了讲述转换过程class TestBlock{...翻译 2019-05-09 16:04:27 · 907 阅读 · 0 评论 -
c++ vector造成的内存泄漏
C++中的std::list, std::array, std::queue, std::map, std::set, std::vector, std::forward_list, std::multiset, std::multimap, std::stack, std::unorderd_map, std::unorderd_multimap, std::unorderd_set, std:...原创 2019-05-07 00:44:26 · 5100 阅读 · 0 评论 -
C++11 constexpr
使用constexpr关键字的变量和函数要求程序在编译期间就知道变量的实际数值和函数的实际返回值并且是而不是在程序运行期间才知道实际数值。而且constexpr语句当中涉及的变量都是const属性的。constexpr比const要求更严格,const可以接受在程序运行期间赋值。constexpr变量:constexpr int conVal = 12; // 等同 const in...原创 2019-05-09 18:00:20 · 149 阅读 · 0 评论 -
#define 函数重载
利用#define达到函数重载的目的通常和编译选项gcc/g++-D相关#define CALL(name) call_##name()void call_one(){ cout<<"call_one()"<<endl;}void call_two(){ cout<<"call_two()"<<endl;}v...原创 2019-05-09 19:03:28 · 750 阅读 · 0 评论 -
C++全局operator重载替换友元operator
class Data{public: explicit Data(int val):m_val(val) { } const int getVal() const { return this->m_val; }private: int m_val;};// 重载全局operator==, 不用直接访问Da...原创 2019-05-09 19:54:49 · 572 阅读 · 0 评论 -
std::remove_extent返回数组降低一个维度后的数据类型, std::rank返回数组维度, std::extent返回数组第一个维度的长度
std::remove_extent返回数组降低一个维度后的数据类型。不改变数据类型的限制属性(const, volatile, const volatile)一维数组降低到0维度;二维数组降低到一维数组;三维数组降低到二维数组;std::extent返回数组第一个维度的长度std::remove_all_extents返回数组的实际类型, int[] -> ...翻译 2019-05-10 23:33:05 · 1505 阅读 · 0 评论 -
C++ shared_ptr
允许多个shared_ptr对象通过引用计数器管理同一块堆内存。堆内存释放条件: 引用计数器为0时,在shared_ptr析构函数中释放堆内存 调用成员函数operator=或者reset被其他指针替代时线程安全性: shared_ptr并不是所有的操作都是线程安全的,访问非const函数依然会发生数据竞争。 C++11提供了std:atomic_is_lock...翻译 2019-05-11 19:53:24 · 779 阅读 · 0 评论 -
c++11 lambda表达式
lambda形式: [capture list](param list)->return_type { body } capture list: 捕获列表,只能是当前lambda表达式所在函数体的局部变量名,直接在body块使用。 param list : 函数参数,传参 return_type : 函数返回值类型,如果body只有一句return语句编译器可以自动...原创 2019-04-23 14:43:36 · 102 阅读 · 0 评论 -
多线程中的单例模式-C++
示例中使用模板创建单例对象,实际操作过程中换成具体类中实现。注意要求单例模式的类要把构造隐藏。#include <iostream>#include <mutex>using namespace std;mutex g_single_mutex;#define sync(action) g_single_mutex.lock(); action; g_sin...原创 2019-03-21 13:58:55 · 523 阅读 · 0 评论 -
C++ auto类型推导注意事项
auto只能推导出数据的不加const,不加引用(&)的数据类型int ia = 12;auto aa1 = ia; // 此时aa的类型是int,相当于int aa = ia;int& ra = ia;auto aa2 = ra; // 我们希望aa2的类型是int&, 实际上aa2的类型是int。如果是class或者struct类型型,这里会调用copy...原创 2019-03-27 10:50:27 · 749 阅读 · 0 评论 -
C++11 字符串与数字的转化
数字到字符串:内部调用sprintf()函数std::string to_string( int value );std::string to_string( long value );std::string to_string( long long value );std::string to_string( unsigned value );std::string to_stri...原创 2019-03-27 11:31:37 · 721 阅读 · 0 评论 -
C++字符串比较
字符串的比较不完全是字符串长度的比较:1、首先是逐个字符的ASCII值的比较至到某个字符的ASCII值不一致或者其中一个字符串到达字符串末尾{ "abcd"与"ba"比较,"ba"大,因为"ba"的字符'b'比"abcd"的字符'a'的ASCII值大}2、如果字符串的前n个字符都一样就比较字符串长度,长度长的字符串大{ "abc"与"abcd"比较,"abcd"大。前三个字符的...原创 2019-04-10 10:10:05 · 3151 阅读 · 0 评论 -
单链表逆转
方法一: 本地逆转void localReverse(Node* head){ Node* pCur = head->next; Node* pNext = head->next->next; pCur->next = nullptr; pCur = pNext; while(pCur) { ...原创 2019-04-13 11:08:46 · 350 阅读 · 0 评论 -
sizeof全面解析
sizeof: 计算变量或者类型的内存占用字节数。是运算符而不是函数。在编译期完成类型或者表达式的内存大小结果。sizeof(指针)在32位系统=4;在64位系统=8.sizeof不能求void类型的长度 sizeof可以求得void*的长度,按指针处理 sizeof可以求得静态分配内存的数组大小,在非堆区开辟内存的数组大小 sizeof不可以求动态分配内存的大小 sizeof在计...原创 2019-04-14 01:45:29 · 263 阅读 · 0 评论 -
C++模板的声明与实现分离的方式
第一种方式:头文件声明模板,源文件实现模板,头文件末尾include源文件#pragma once// 类模板template<typename T>class TestClass{public: TestClass(const T&); void printFunc();};// 函数模板template<typename T&g...原创 2019-04-22 22:51:01 · 757 阅读 · 0 评论 -
std::move,std::forward;std::remove_reference
/** 引用折叠* A& & 折叠成 A&* A& && 折叠成 A&* A&& & 折叠成 A&* A&& && 折叠成 A&&*/template<class _Ty>struct remove_reference{...翻译 2019-04-22 23:52:50 · 617 阅读 · 0 评论 -
C++11右值引用
用一个简单的方式理解右值引用在内存的状态:从图中明白:左值引用是对变量的引用(const int &rint = 1这种方式例外)右值引用就是对变量对应的值的引用,为了延长这块值所在内存的声明周期(如果一块内存的引用计数为0就释放这块内存)另外从代码执行的结果中明白函数return语句执行了两个过程: 第一步:给接收本返回值的变量赋值,如果没有变量接收就创建一...原创 2017-08-23 15:41:55 · 167 阅读 · 0 评论