码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++ 围炉札记


    在这里插入图片描述


    文章目录

    • 内存检测
    • ProtoBuf
    • CMake、vscode、clion、Qt
    • 右值
      • 1、临时变量右值引用
      • 2、右值引用本质
    • 函数返回
    • POD(Plain Old Data)
    • thread_local
    • new / delete
      • 1、定位new运算符
    • 可变参数模板
    • typename和class
      • 1、C++模板类头文件和实现文件分离的方法
      • 2、函数显示实例化
      • 3、类显示实例化
    • 存储持续性、作用域和链接性
      • 1、const、volatile、mutable
      • 2、语言链接性
      • 3、Linux下so库的符号可见性
    • 友元与操作符重载
    • operator (转换函数、操作符重载、User-defined literals)
    • constexpr
    • C++ 原始字符串
    • 继承与多重继承
    • 异常
    • RTTI与类型转换
    • 智能指针
    • pair 和 tuple(元组)
    • std::function
    • algorithm
    • emplace_hint
    • valarray
    • iostream


    内存检测

    Valgrind Home
    valgrind简介与使用_WuYuJun’s blog的博客-CSDN博客_valgrind
    内存检测王者之剑—valgrind - 知乎

    Clang Sanitizers
    编译器自带的调试神器sanitizers - 知乎
    clang自己的一些sanitizer,可以借鉴_去级得骨灰的博客-CSDN博客
    C++内存泄漏、数组越界……检测工具:Sanitizers_Owl丶的博客-CSDN博客_检查数组越界工具


    ProtoBuf

    深入 ProtoBuf - 简介 - 简书
    GitHub - protocolbuffers/protobuf: Protocol Buffers - Google’s data interchange format
    Protobuf 详解_Vic_Hao的博客-CSDN博客_protobuf
    Protobuf的简单介绍、使用和分析_单飞的梦的博客-CSDN博客_protobuf
    protobuf详解 - 知乎
    深入 ProtoBuf - 编码 - 简书


    CMake、vscode、clion、Qt

    VSCode 和 CLion 探索
    VSCode 精品教程

    一文搞懂如何在CMake中使用Qt_Copperxcx的博客-CSDN博客_cmake qt
    CMake 教程
    Cmake官方教程解析


    右值

    左值引用和右值引用_陆尔尔的博客-CSDN博客_左值引用和右值引用
    C/C++学习记录:std::move 源码分析_河边小咸鱼的博客-CSDN博客_c++ move源码

    1、临时变量右值引用

        左值引用和右值引用都可以把临时对象的生命周期延长到与引用自身的生命周期相同。
    说到实现,其实是变量替换,临时变量直接被构建在引用变量的位置,生命周期自然相同了。

    T f() {
      return T{};
    }
    T&& a= f();
    //a继续有效
    
    • 1
    • 2
    • 3
    • 4
    • 5

    被编译器看成

    void f(T& temp){
      temp = ... 直接构造,不会走复制或移动构造函数
    }
    T a;
    f(a);
    //a继续有效。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、右值引用本质

        看不出右值引用对普通基本数据有任何实际意义,但是大量文章使用基本数据来讲解,完全没有讲到有意义的点子上,这样过于简化讲解,容易误导、困惑初学者。右值引用真正用意,是用于解决类对象内部拥有的动态数据的回收(转移),提高程序运行效率。普通数据对右值引用的适用,仅仅是个副产品。

        我们再看一个移动构造函数的具体实现,方便大家理解move语义存在的价值:

    class MyVector {
        int* data_;
        size_t size_;
     
    public:
        MyVector(): size_(100) {
            data_ = new int[size_];
        }
     
        ~MyVector() {
            delete[] data_;
        }
     
        MyVector(const MyVector& my_vector) {                                       // Copy constructor
            size_ = my_vector.size_;
            data_ = new int[size_];
            std::copy(my_vector.data_, my_vector.data_ + my_vector.size_, data_);
        }
     
        MyVector(MyVector&& my_vector) {                                            // Move constructor
            size_ = my_vector.size_;
            data_ = my_vector.data_;
            my_vector.size_ = 0;
            my_vector.data_ = nullptr;
        }
     
        // Should define copy assignment operator here
     
        // Should define move assignment operator here
    };
     
    MyVector my_vector;
    MyVector my_vector1 = my_vector;                                                // my_vector is lvalue, thus copy constructor is invoked.
    MyVector my_vector2 = std::move(my_vector);                                     // std::move(my_vector) is rvalue, thus move constructor is invoked.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

        这里,我们实现了一个简单的数组类,自定义了拷贝构造函数和移动构造函数。在拷贝构造函数中,把旧 data_ 数组中的每个元素依次赋值到新的对象中。在移动构造函数中,直接把旧 data_ 数组的指针赋值给新对象,从而避免了数据的拷贝。但移动后,需要把旧对象的 size_ 标记为 0,把 data_ 指针置空,以表示所有权的转移。这个简单的例子揭示了移动语义存在的价值,因为有些情况下,数据是可以转移所有权的,而不必拷贝一份。


    函数返回

    C++函数返回值作为左值问题 - Mr.南柯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园
    C++primer第五版 函数返回左值_elma_tww的博客-CSDN博客_c++ 函数返回左值
    c++ 函数返回引用_keyouan2008的博客-CSDN博客_c++ 返回引用
    函数返回值的优化技术(RVO和右值引用)_werflychen的博客-CSDN博客_函数返回右值引用
    返回值和右值引用的传递问题_章志强的博客-CSDN博客_返回右值引用
    C++函数的返回类型声明为一个右值引用类型,会发生什么事情? - 知乎

    char &change_value(string &str, int n) {
    	return str[n];
    }
    
    • 1
    • 2
    • 3

    POD(Plain Old Data)

    C++中的POD类型_柚子树cc的博客-CSDN博客_c++ pod
    c++中的POD类型 - 柳刚 - 博客园


    thread_local

    c++11: thread_local_zzhongcy的博客-CSDN博客_c++ thread_local
    C++11 thread_local用法 - 知乎


    new / delete

    C/C++——new和delete的实现原理(详解)__BitterSweet的博客-CSDN博客_c++ new的实现
    CC++中的new和delete的实现过程 - 百度文库
    VS 反汇编方法及常用汇编指令介绍_超自然祈祷的博客-CSDN博客_vs反汇编

    1、定位new运算符

    C++定位new运算符 - 知乎
    C++ 定位new运算符_Timplan的博客-CSDN博客_定位new运算符
    定位new运算符_努力的小带土的博客-CSDN博客_定位new运算符


    可变参数模板

    可变参数模板(C++11)_tony__lin的博客-CSDN博客_可变参数模板
    C++可变参数模板 - 知乎


    typename和class

    关于C++中模板中的typename和class的区别比较 - 百度文库
    C++模板详解(一) - 百度文库
    C++模板之typename和class关键字的区别 - CTHON - 博客园
    C++函数模板及其实例化和具体化_Morning_Glory_JR的博客-CSDN博客_c++ 函数模板实例化
    C++11函数模板的默认模板参数 - 云+社区 - 腾讯云
    C++模板特化与偏特化 - 云+社区 - 腾讯云

    template<typename T,typename U=double>
    void testTemplateFunc(T t=0,U u=0) {
    	cout<<"t="<<t<<" u="<<u<<endl;
    }
     
    // ================================================================
     
    //函数模板
    template<typename T, class N> void compare(T num1, N num2)
    {
        cout << "standard function template" << endl;
        if(num1>num2)
            cout << "num1:" << num1 << " > num2:" << num2 <<endl;
        else
            cout << "num1:" << num1 << " <= num2:" << num2 << endl;
    }
     
    //对部分模板参数进行特化
    template<class N> void compare(int num1, N num2)
    {
        cout<< "partitial specialization" <<endl;
        if (num1>num2)
            cout << "num1:" << num1 << " > num2:" << num2 << endl;
        else
            cout << "num1:" << num1 << " <= num2:" << num2 << endl;
    }
     
    //将模板参数特化为指针
    template<typename T, class N> void compare(T* num1, N* num2)
    {
        cout << "new partitial specialization" << endl;
        if (*num1>*num2)
            cout << "num1:" << *num1 << " > num2:" << *num2 << endl;
        else
            cout << "num1:" << *num1 << " <= num2:" << *num2 << endl;
    }
     
    //将模板参数特化为另一个模板类
    template<typename T, class N> void compare(std::vector<T>& vecLeft, std::vector<T>& vecRight)
    {
        cout << "to vector partitial specialization" << endl;
        if (vecLeft.size()>vecRight.size())
            cout << "vecLeft.size()" << vecLeft.size() << " > vecRight.size():" << vecRight.size() << endl;
        else
            cout << "vecLeft.size()" << vecLeft.size() << " <= vecRight.size():" << vecRight.size() << endl;
    }
     
    // ================================================================
     
    //类模板
    template<typename T, class N> class TestClass
    {
    public:
        static bool comp(T num1, N num2)
        {
            cout <<"standard class template"<< endl;
            return (num1<num2) ? true : false;
        }
    };
     
    //对部分模板参数进行特化
    template<class N> class TestClass<int, N>
    {
    public:
        static bool comp(int num1, N num2)
        {
            cout << "partitial specialization" << endl;
            return (num1<num2) ? true : false;
        }
    };
     
    //将模板参数特化为指针
    template<typename T, class N> class TestClass<T*, N*>
    {
    public:
        static bool comp(T* num1, N* num2)
        {
            cout << "new partitial specialization" << endl;
            return (*num1<*num2) ? true : false;
        }
    };
     
    //将模板参数特化为另一个模板类
    template<typename T, class N> class TestClass<vector<T>,vector<N>>
    {
    public:
        static bool comp(const vector<T>& vecLeft, const vector<N>& vecRight)
        {
            cout << "to vector partitial specialization" << endl;
            return (vecLeft.size()<vecRight.size()) ? true : false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    1、C++模板类头文件和实现文件分离的方法

    C++模板类头文件和实现文件分离的方法

    // template_compile.h
    template<class T>  
    class base {  
    public:  
        base() {};  
        ~base() {};  
        T add_base(T x,T y);  
    };  
     
     
    // template_compile.cpp
    #include "template_compile.h"  
    template<class T>  
    T base<T>::add_base(T x,T y) {  
        return x+y;  
    }  
     
     
    // 在使用模板的测试文件use_template.cpp中:使用#include "template_compile.cpp"
    #include  
    #include "template_compile.cpp"  
    using namespace std;  
    void main()  
    {  
        base<int> bobj;  
        cout<<bobj.add_base(2,3)<<endl;  
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在使用模板的测试文件 use_template.cpp 中:使用 #include “template_compile.cpp”
       
    或者把模块定义和实现都放在头文件中

    【C++】类模板分离式写法_ainu412的博客-CSDN博客_分离式写类
    C++模板(函数模板/类模板)_普通网友的博客-CSDN博客_c++函数模板

    2、函数显示实例化

    #include 
    using namespace std;
    template <typename T> void func(T t) {
        cout << t << endl;
    }
     
     
    // 函数模板显示实例化
    // template [函数返回类型][函数模板名]<实际类型列表>(函数参数列表)
    template void func<int>(const int&);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3、类显示实例化

    #include 
    using namespace std;
    template <typename T> class A {
        T num;
    public:
        A() {num = T(6.6);}
        void print() {
            cout << "A num:" << num << endl;
        }
    }
     
     
    //类模板的显示实例化
    //template class [类模板名]<实际类型列表>
    template class A<int>;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    存储持续性、作用域和链接性

    9.2.5 静态持续性、内部链接性_落雪snowflake的博客-CSDN博客
    C++内部链接性和无链接性

    1、const、volatile、mutable

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    语言链接性:

    extern "C" void spiff(int);
    extern void spiff(int);
    extern "C++" void spiff(int);
    
    • 1
    • 2
    • 3

    2、语言链接性

    在这里插入图片描述


    3、Linux下so库的符号可见性

    Linux动态库同名函数处理原则 - 百度文库
    Linux下so库的符号可见性: 解决多个库同名符号冲突问题_glemo的博客-CSDN博客
    linux 下同名符号冲突问题解决方案 | 函数


    友元与操作符重载

    C++友元函数和友元类(C++friend)详解 - 百度文库
    运算符重载的非成员函数形式_Jaihk662的博客-CSDN博客_运算符重载为非成员函数
    C++运算符重载为非成员函数
    C++知识积累:成员函数运算符重载与非成员函数运算符重载_HerofH_的博客-CSDN博客_成员函数运算符重载


    operator (转换函数、操作符重载、User-defined literals)

    C++转换函数 (conversion function)_万里归来少年心的博客-CSDN博客_转换函数
    c++重载操作符operator的用法_炎芯随笔的博客-CSDN博客
    【c++】由构建复数类简析c++的user defined literal特性_ChillPolaris的博客-CSDN博客
    User-defined literals (since C++11) - cppreference.com
    C++ User-defined literals - 知乎


    constexpr

    constexpr究竟有什么用? - 知乎
    C++之constexpr详解_云洞的博客-CSDN博客_constexpr
    constexpr_傻月菇凉的博客-CSDN博客_constexpr
    C++ const 和 constexpr 的区别? - 知乎
    C++11/14 constexpr 用法 - 简书


    C++ 原始字符串

    C++ 原始字符串_Niklaus9084的博客-CSDN博客_c++ 原始字符串


    继承与多重继承

    继承与派生(Part Ⅲ)——多重继承 & 虚基类_—Miss. Z—的博客-CSDN博客
    虚基类(多重继承)_GoodLinGL的博客-CSDN博客_虚基类的继承


    异常

    C++的throw抛出异常机制
    C++ throw抛出异常用法详解


    RTTI与类型转换

    C++ RTTI详解_彼 方的博客-CSDN博客_rtti
    C++ RTTI详解
    C++ RTTI 和四种类型转换
    (C++ 成长记录) —— C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)
    C++:const_cast的简单理解
    dynamic_cast使用以及原理探究



    智能指针

    C++智能指针详解:shared_ptr_吃素的施子的博客-CSDN博客_c++ shared_ptr
    C++ shared_ptr用法、简析、案例_ve2102388688的博客-CSDN博客_c++ shared_ptr
    C++ weak_ptr_L7256的博客-CSDN博客_c++ weak_ptr
    C++智能指针weak_ptr详解_物随心转的博客-CSDN博客_c++ weak_ptr
    C++智能指针unique_ptr 详解_物随心转的博客-CSDN博客_c++ unique_ptr
    C++简单实现unique_ptr_吃米饭的博客-CSDN博客_c++ unique_ptr
    C++ | auto_ptr与unique_ptr
    C++智能指针:auto_ptr、unique_ptr、shared_ptr、weak_ptr
    【Qt】Qt中智能指针_iriczhao的博客-CSDN博客_qt 智能指针


    pair 和 tuple(元组)

    C++ pair的用法_&Mr.Gong的博客-CSDN博客_c++ pair
    c++ pair详解_lwgkzl的博客-CSDN博客_c++ pair
    C++中的tuple(元组)_奋斗的小菜鸟!的博客-CSDN博客_c++ tuple


    std::function

    std::function详解_在座的各位都是高手的博客-CSDN博客_std::funciton
    std::function详解_A 壹零贰肆的博客-CSDN博客


    algorithm

    C++的 remove函数
    C++ remove()函数用法详解(深入了解,一文学会)

    C++神奇的next_permutation

    C++的std::bind1st和std::bind2nd

    C++中的Transform简介


    emplace_hint

    C++ set emplace_hint()用法及代码示例


    valarray

    C++中的valarray sqrt()函数
    Valarrays


    iostream

    C++的setf方法
    fsteam in out ate app理解
    ios::app与ios::ate的区别
    ios::binary和ios::text打开文件区别,fstream读写文件示例
    fstream详解


  • 相关阅读:
    Python编程逐级进阶2
    cs架构下抓包的几种方法
    【PyCharm Community Edition】:分析map文件统计RAM及ROM的使用
    国际航运管理简答题-题库
    从字节码角度带你彻底理解异常中catch,return和finally,再也不用死记硬背了
    tp6 小程序码生成(带参数)
    c++小知识
    阿里巴巴API接口解析,实现按关键字搜索商品
    【西门子】PLC编程之程序下载和PLC连动调试
    【考研数学】三. 微分方程
  • 原文地址:https://blog.csdn.net/Liuqz2009/article/details/132752946
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号