Effectivve Modern Cpp
文章平均质量分 58
「已注销」
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
shared_ptr 源码分析
共享指针说明shared_ptr类提供类的行为接口.有专门的父类提供数据管理接口.实现涉及到继承,以及引用计数是否需要多线程安全.控制块的类型.源码shared_ptr template<typename _Tp> class shared_ptr : public __shared_ptr<_Tp> { template<typename... _Args> usi..原创 2022-01-28 23:03:52 · 1706 阅读 · 0 评论 -
unique_ptr 源码分析
unique_ptr简介独占实现了构造,实现了移动.不允许拷贝.实现unique_ptr提供了指针拥有的接口用__uniq_ptr_impl提供的是数据和析构类.源码源码 template <typename _Tp, typename _Dp = default_delete<_Tp>> class unique_ptr { template <class _Up&g..原创 2022-01-28 20:43:21 · 731 阅读 · 0 评论 -
c++11 shared_ptr简略描述
共享原理多个对象之间共享一份资源.用对象的声明周期管理动态分配资源的声明周期.没有使用者的时候就析构.实现引用计数新对象使用计数+1.对象死亡析构,计数-1.为0释放.数据成员数据成员指针.共享数据块指针.析构说明默认delete.也可以自定义析构.释放资源释放不一定是内存.也可以是文件,或者硬件.同类型不同析构析构被作为多态类的一个数据成员.即模板形式的多态类.构造函数也是模板..原创 2022-01-25 21:54:49 · 526 阅读 · 0 评论 -
C++11 智能指针 unique_ptr,让资源管理更简单,更安全
总览轻量级行为基本和原始指针相同.大小默认:delete析构,大小和原始指针一样.实现支持构造和移动,不支持拷贝.数据采用tuple组合,组合类之间采用继承的方式.析构默认和自定义.使用工厂.不完整的成员指针变量.转换unique_ptr独占.移动转化为shared_ptr也是可以的.轻量级默认使用delete析构.大小和原始指针一样.分析templa..原创 2022-01-21 22:06:41 · 3038 阅读 · 0 评论 -
C++11 类的六大基本成员函数默认生成,default字段的含义
总览核心编译器会为一个类按需自动生成成员函数.C++98:构造,析构,拷贝构造,拷贝赋值.C++11:有了右值,就多了两个,移动构造和移动赋值.功能构造: 无参构造.T()析构: 调用成员变量析构.~T()拷贝构造: 同类型对象初始化.T a, b = a;拷贝赋值: 同类型对象赋值.T a,b; b = a;移动构造: 同类型右值初始化.T a = T();移动构造: 同类型右值赋值.T a; a = T();机..原创 2021-12-28 23:03:40 · 1091 阅读 · 0 评论 -
C++11 推荐 const 修饰的成员函数 最好实现成线程安全的,否则就尽量不要这样修饰
总览核心const修饰的成员函数理论上说是不会修改值的.如果有成员mutable,则是可以修改.修改就会遇到资源竞争和多线程安全问题。多线程安全只有多线程共享的数据才会有多线程安全问题。即一致性问题,其实对于某些数据,只有整个独占才能保证多线程安全。或者确认不共享,只有一个线程串行使用。文章内容多线程安全函数的案例不太靠谱。不过是针对C++98和C++11来将,还是有一点内容的。多线程安全读写..原创 2021-12-25 21:32:30 · 2299 阅读 · 0 评论 -
线程为什么需要 join
join干嘛线程和函数线程在另一个核心上干另一件事和当前线程一起干活。多线程一般是用于干两件不同的事情。函数则是有先后顺序。案例假如我有分身,一个分身在学校学习,一个分身在外面玩儿。两个分身各自独立,在完成任务后,在家里同步进度,只需要知道最终结果即可。(三傻大闹宝莱坞的代读)同理,一个做任务分发,另一个线程则干活。任务分发的线程就只需要分发任务,然后等待工作线程的结果就行。怎么获取?join的方式等待,然后获取返回值。一个工..原创 2021-12-25 14:49:23 · 718 阅读 · 0 评论 -
C++11 constexpr 有些事情,编译阶段就可以帮你做了
总览constexpr修饰变量,变量必须在执行前确认.修饰函数,表示入参和出参可能在编译前确认.函数constexpr修饰的函数里面的都应该是constexpr.让编程更加灵活.如果不是,就可以值能普通函数用.返回值不是const,仅仅用于修饰.变量const类型的变量,执行前确认值.可能放在只读区域.constexpr是const的加强版.constexpr修饰的变量核心执行前必须能..原创 2021-12-25 11:11:20 · 1436 阅读 · 0 评论 -
C++11 鼓励对肯定不抛出异常的函数添加 noexcept 修饰
总览新机制对noexcept修饰的函数进行优化.noexcept可以传导和查询.异常用异常代替if else.将if else统一到一个地方处理.异常必须处理的错误,直接抛出异常.不需要处理的错误.noexcept函数任意时刻调用都不会出错.noexcept可以是非noexcept组成.主流函数大部分都是可能抛出异常的.不一定非要追求noexcept,不要用return code..原创 2021-12-23 21:50:46 · 779 阅读 · 0 评论 -
C++11 推荐只要可以,尽量用const类型的迭代器
主要内容核心内容迭代时,只要不修改,都建议用const类型的迭代器.C++98的迭代器简单难用,C++11则加强了,希望广泛使用.好处减小被修改的风险.迭代器++,--这种,各类容器的操作抽象化.比如数组的迭代器++,--是偏移,链表的则是切换节点,树的++,--则是递归遍历.其他的容器就更加复杂了.迭代器的好处将复杂的操作统一且抽象化了.隐藏细节,使用简单.const迭代器什么时候推荐..原创 2021-12-20 22:50:03 · 1651 阅读 · 0 评论 -
C++11多肽类 必用关键字 override
主要内容好处C++11提供override关键字用于保障虚函数重载的正确性.虚函数重载和父类的虚函数声明一毛一样.如何一样虚函数才能重载.函数名一样.(析构除外).入参一样.函数修饰一样.返回值和异常处理兼容.非虚函数案例#include <iostream>#include <memory>class A {public: void show(int a){..原创 2021-12-18 21:56:56 · 1606 阅读 · 0 评论 -
C++11 delete 更优于私有化声明
C++11 delete简介delete声明的函数也会参与匹配,但是编译阶段就明确此类型的函数已被删除.delete的错误可以在编译阶段发现.回顾C++98声明为private且不定义. 链接 阶段才能发现.delete解决的问题C++编译器默认为类创建: 无参构造,析构,拷贝,赋值四个函数.冲突的就是: 拷贝赋值这两个函数.c++98通过private私有声明并不定义以此达到目的.但是只能链接阶段才能检..原创 2021-12-17 23:23:22 · 1402 阅读 · 0 评论 -
C++11 枚举加不加class 的区别
C++11优化C++11C++11支持枚举有类型. 避免命名污染。C++11支持枚举继承类型. 不被编译器主导类型,从而类型不定.C++11支持枚举声明. 不用因为修改而导致没有用到的一些函数需要编译.C++98哪儿声明,在哪儿用. 局部有效. 污染命名空间.不能声明,只能定义.污染命名空间分析C++98的enum哪儿定义,哪儿使用.而且没有限制,定义了就相当于是一个变量.案例int main() {..原创 2021-12-17 09:12:46 · 893 阅读 · 0 评论 -
c++11 推荐用 using 而不是 typedef
总览using比typedef好在哪些地方.using支持模板的别名.using有编译器加持.相同点都是别名,不过using的看起来更加简洁.相同点别名#include<iostream>using Myshow = void (*)();typedef void(*Dshow)();void show() { std::cout << __LINE__ << std::endl;}..原创 2021-12-16 09:18:22 · 516 阅读 · 0 评论 -
c++11 推荐 nullptr 而不是 NULL
类型差异NULL和0#include <iostream>template <typename T>void show( T&& a) { a.error();}int main () { show(NULL);}输出D:\codes\cfile\Test\test.cpp: In instantiation of 'void show(T&&) [with T = long long int]':..原创 2021-12-14 23:05:35 · 823 阅读 · 0 评论 -
C++11 {} 初始化
简介说明主要内容是介绍{},即braces花括号在C++11中的作用。作用默认构造和默认初始化.值列表初始化。{}表示无参默认构造.默认值和随机#include <iostream>int main() { int a; int b{}; std::cout << a << std::endl; std::cout << b << std::endl; retu..原创 2021-12-12 15:31:02 · 1968 阅读 · 0 评论 -
auto的问题
说明不能正确处理内部编译的隐式类型。vector<bool>说明[]返回的不是bool,而是中间代理类型.案例一#include<vector>template<typename T>void show(T&& t) { t.error();}int main() { std::vector<bool> s{ true,false }; auto t = s[0];..原创 2021-12-02 08:30:16 · 736 阅读 · 0 评论 -
auto的优势
总览主旨大多数都推荐用auto,少数情况还是要用显式声明.主要内容养成声明并初始化的习惯.auto的代码更简洁.auto可以声明未知类型变量.auto比std::function的好处.必须赋值说明变量声明的时候就给赋值,可以一定程度上避免错误.声明并赋值效率可能并不高,不过代码更严谨.所以一般推崇使用的地方声明并定义.效果不初始化编译不通过,编译阶段的检查.案例一int main() { auto ..原创 2021-12-01 23:43:11 · 426 阅读 · 0 评论 -
decltype 使用
功能decltype可以将给定的表达式或变量的类型推导出来,包含引用和指针。一般用于复杂表达式作为返回值的类型推导。可以用于补足c++11的auto缺陷.编译阶段的事情,不会任何执行,表达式也不会执行。类型规则规则一:声明类型,类型包含引用就有引用,没有引用也不会自行添加。规则二:返回值则根据返回值类型确定最终类型。规则三:表达式根据默认和重载得到的最终类型。不建议特别复杂的表达式。声明类型分析案例一int main() ..原创 2021-12-01 22:45:12 · 881 阅读 · 0 评论 -
auto 和 template 的区别
说明auto是基于template的规则实现的.但是有一些细微的差异.auto支持{....}类型,但不支持匹配结果T.auto必须初始化.对应关系说明valutype对应赋值的类型.argtype对应声明的变量类型.auto对应T差异template不支持{...}类型.但是auto支持.valuetype是赋值的类型,有默认类型,有函数返回值类型.一般是函数返回值类型.argtype则是在valuet..原创 2021-11-28 22:43:04 · 1556 阅读 · 0 评论 -
模板推导数组函数,获取数组长度
数组和函数推导说明非引用类型,推导成指针。引用类型,推导成数组加长度。注意数组获取长度是有意义的,不过建议新型数组.数组说明推导出来长度.数组和指针,是两个概念,虽然又通用。数组是长度固定的数组类型, 指针是可以为任意类型任意值的类型.内部也不方便计算.案例一template<typename T>void show(T& a) { // error code a.nice();}in..原创 2021-11-28 18:31:13 · 534 阅读 · 0 评论 -
模板类型推导 T
类型推导c++98只有template一种.c++11auto template并做了一点改良.c++14在c++11的基础上做了加强auto和decltype的组合.推导优劣好处少打代码.可以声明不确定类型的变量类型.必须初始化.在修改某返回类型时,不用改太多.劣势阅读性不强.甚至可能得不到预期的.地位C++的新特性基本都是基于类型推导,所以需要好好的学习掌握类型推导的原理.主..原创 2021-11-28 17:34:59 · 1087 阅读 · 0 评论 -
查看类型推导结果
typeid的方式编译器查看编译结果推荐编译结果查看怎么查看错误代码导致编译错误,然后编译器输出结果查看。template<typename T>void show(const T& a) { // error code a.nice();}int main() { show(1);}编译输出已启动生成…1>------ 已启动生成: 项目: test, 配置: Debug Win32 ------1>te..原创 2021-11-27 18:33:37 · 349 阅读 · 0 评论 -
类型推导优劣
好处 程序员偷懒,减少书写简单或复杂类型。类型修改代码不用改太多。坏处 阅读不太方便。auto 基于 decltype 开发。基本没有差异。decltype 单独的机制。原创 2021-10-28 23:59:08 · 146 阅读 · 0 评论 -
C++版本差异
98 模板11 模板 auto14 模板 auto加强,支持返回类型推导,lambda入参推导,即匿名模板。原创 2021-10-28 23:54:57 · 882 阅读 · 0 评论
分享