随笔分类 -  c++基础

c++基础的随笔记录
摘要:懒汉模式:在使用时候才创建出对象 在多线程时,会出现安全问题 class Test{ 2 public: 3 static Test* getInstance{ 4 if(m_test==NULL){ 5 m_test=new Test(); 6 } 7 return m_test; 8 } 9 p 阅读全文
posted @ 2024-05-08 14:48 iu本u 阅读(6) 评论(0) 推荐(0) 编辑
摘要:先定义一个计算内存的结构体,创建一个这样的结构体作为全局变量,然后重载new和delete运算符,每次对内存操作时都会跟踪内存分配 在main函数的最后加上CrtDumpMemoryLeaks(),可以定位到内存没有被释放的位置在哪里,有多大的内存 阅读全文
posted @ 2024-04-26 13:16 iu本u 阅读(5) 评论(0) 推荐(0) 编辑
摘要:如果需要析构函数,就一定要复制构造函数和拷贝赋值操作符 为了支持移动语义,又加入了移动复制构造函数和移动拷贝赋值操作符【90】stdmove与移动赋值操作符_哔哩哔哩_bilibili 阅读全文
posted @ 2024-04-25 15:59 iu本u 阅读(5) 评论(0) 推荐(0) 编辑
摘要:#include<iostream> #include<array> template<typename T,size_t S> class Array { private: T m_data[S]; public: constexpr int Size()const { return S; } T 阅读全文
posted @ 2023-11-09 20:06 iu本u 阅读(3) 评论(0) 推荐(0) 编辑
摘要:三法则:如果需要构造函数一定要有复制构造函数和赋值构造函数 五法则:为了支持移动语义有增加了移动构造函数和移动赋值运算符 需要区分移动构造函数和移动赋值运算符;完全取决于所赋值的对象开始的值有没有先构造。 使用移动语义去重写复制构造函数会让它变成窃取资源是原来的对象资源便空 阅读全文
posted @ 2023-11-09 19:02 iu本u 阅读(11) 评论(0) 推荐(0) 编辑
摘要:为了避免复制构造函数复制类而占用内存,使用移动语义去潜复制。 move(类名 other),重写复制构造函数,指的是类中初始化成员变量时可以使用move,其他时候使用的是右值引用 或者用右值引用传参重写复制构造函数:类名&& 使用std::move去代替右值引用的参数赋值 阅读全文
posted @ 2023-11-09 18:41 iu本u 阅读(15) 评论(0) 推荐(0) 编辑
摘要:左值是存在地址存储的值,右值是一个临时值 左值引用只能赋值为左值,除非加const 右值引用是加“&&” 阅读全文
posted @ 2023-11-08 15:36 iu本u 阅读(6) 评论(0) 推荐(0) 编辑
摘要:在原来的string操作中,大多数都是复制string进行操作,如:substr()、string&传参。它们都会复制占用额外内存。 使用std::string_view犹如只是对它的视图映射进行处理,有一个指针指向一个起始位置,然后会有一个size参数去决定这个指针的移动步数。 #if 1 Pri 阅读全文
posted @ 2023-10-30 19:34 iu本u 阅读(45) 评论(0) 推荐(0) 编辑
摘要:它可以将可能存在或者不存在的内容以合适的方式返回,当返回的是空文件时,可以使用_.value_or("初始值") std::optional<std::string> data=OpenFileAsstring("data.txt"); string value=data.value_or("Not 阅读全文
posted @ 2023-10-23 18:58 iu本u 阅读(5) 评论(0) 推荐(0) 编辑
摘要:当返回多个参数时,可以使用tuple、pair,它们都是使用get<0...n>(name)取值 结构体绑定;就是将返回的参数自定义名字,要用"[]"括起来。 std::pair<std::string, int>CreatePerson(){ return { "Kxin",22 }; } aut 阅读全文
posted @ 2023-10-23 16:53 iu本u 阅读(6) 评论(0) 推荐(0) 编辑
摘要:class Timer { private: std::chrono::time_point<std::chrono::high_resolution_clock>m_StartTimepoint; public: Timer() { m_StartTimepoint = std::chrono:: 阅读全文
posted @ 2023-10-18 21:03 iu本u 阅读(20) 评论(0) 推荐(0) 编辑
摘要:都在运行时执行,而不是在编译时执行,所以有运行成本。它们实际是函数,所以需要传参数,还有返回值。 \static_cast: c++中传统的类型转换直接使用(类型),如果出错也不会提醒错误,但使用static_cast<类型>就会提示 reinterpret_cast: 类型相关的转换,起始是底层内 阅读全文
posted @ 2023-10-16 20:54 iu本u 阅读(23) 评论(0) 推荐(0) 编辑
摘要:一般标记了virtual的关键字就是虚函数,虚函数就代表这个函数之后要进行重写; 虚函数增加virtual之后是将会将子类的函数扩展添加进去,而不是重写。 class Base { public: Base() { std::cout << " Base Constructor \n"; } vir 阅读全文
posted @ 2023-10-08 20:03 iu本u 阅读(15) 评论(0) 推荐(0) 编辑
摘要:联合体只有一个成员,所以可以在一个联合体用不同的方式定义一个成员 这一个成员站得内存都是一个内存 联合体可以是匿名的也可以是有名字的 struct Vector2{ float x, y; }; struct Vector4 { union { struct { float x, y, z, w; 阅读全文
posted @ 2023-10-08 19:14 iu本u 阅读(8) 评论(0) 推荐(0) 编辑
摘要:std::sort(vector.begin(),vector.end(),[](int a,int b){ if(a==1)return false;//a为1就将这个1排在最后,因为返回的是false if(b==1)return true;//还是将1排在最后 return a>b;//降序排 阅读全文
posted @ 2023-10-07 13:56 iu本u 阅读(92) 评论(0) 推荐(0) 编辑
摘要:创建Thread:std::thread worker(操作); 打印当前线程的id:std::this_thread::get_id(); is_finished=false; DoWork(){ using namespace std::literals::chrono_literals; st 阅读全文
posted @ 2023-09-26 19:23 iu本u 阅读(72) 评论(0) 推荐(0) 编辑
摘要:lambdas形式是: [](参数列表){操作} 【】里面是捕捉方式,即传参的方式 可以结合lambdas来增加筛选条件 vector<int>v{3,9,7,3,1}; auto it=std::find_if(v.begin(),v.end(),[](int value){return valu 阅读全文
posted @ 2023-09-25 19:21 iu本u 阅读(10) 评论(0) 推荐(0) 编辑
摘要:函数指针可以将函数作为函数的参数,对函数的参数设置想要的操作 void PrintValue(int value){ std::cout<<value<<std::endl; } void ForEarch(const std::vector<int>& v,void(*funtion)(int)) 阅读全文
posted @ 2023-09-20 20:57 iu本u 阅读(4) 评论(0) 推荐(0) 编辑
摘要:元组tuple;#include<tuple> std::tuple<std::string,istd::string,nt>sources; std::get<0>sources,std::get<1>sources; pair std::pair<std::string,std::string> 阅读全文
posted @ 2023-09-20 15:43 iu本u 阅读(5) 评论(0) 推荐(0) 编辑
摘要:是在运行时将文件连接进项目 将dll.lib文件复制至Debug的可执行文件里面;将linker中的input额外依赖改成这个dll.lib文件的名字 阅读全文
posted @ 2023-09-13 20:06 iu本u 阅读(12) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示