《编程语言》C/C++
文章平均质量分 86
C/C++相关的编程语法
Yngz_Miao
这个作者很懒,什么都没留下…
展开
-
【C++】奇异递归模板模式CRTP——静态多态
奇异递归模板模式(Curiously Recurring Template Pattern,CRTP)是C++模板编程时的一种惯用法(idiom):把派生类作为基类的模板参数。更一般地被称作F-bound polymorphism。CRTP在C++中主要有两种用途:静态多态(static polymorphism)添加方法,同时精简代码。本文将会对CRTP,进行比较详细的讲解。原创 2024-08-30 18:49:06 · 1208 阅读 · 0 评论 -
【C++】C++11多线程下可用的对象池
在我日常的项目中,对象池是使用场景非常广泛的一种手段。本文就对对象池的设计原理进行讲解,并对其底层进行抽象,提供一个可以快速、简单上手的对象池模板类。对象池原理对象池是一种空间换时间的技术,对象被预先创建并初始化后放入对象池中,对象提供者就能利用已有的对象来处理请求,并在不需要时归还给池子而非直接销毁。它减少对象频繁创建所占用的内存、空间和初始化时间。原创 2024-08-30 18:48:04 · 1128 阅读 · 0 评论 -
【C++】模板中template、typename的非常见用法
模板是指:C++程序设计中采用类型作为参数的程序设计,用于支持通用程序设计。C++的标准库提供许多有用的函数大多结合了模板的观念,如STL、IO Stream等。在模型的声明中,最最最常见的用法就是:值得注意的是:模板在编译的时候并不知道这个T是什么类型,只有在实例化的时候才能够知晓。因此,这会导致在模板较复杂的时候,可能会产生很多意想不到的理解上的歧义。为了规避这种歧义性,typename和template在某些特定的情况下,需要点明。这就是它们的非常见用法。原创 2023-08-12 17:12:56 · 12956 阅读 · 0 评论 -
【C++】浅析关于STL容器迭代器失效的情况
最近写代码想要实现一个功能,对于一个vector,需要将后续添加的元素进行反序操作。由于不想使用一个临时的vector,想要在原vector进行功能实现,因此就直接利用std::reverse方法进行操作。理论上说,。那么按照这个思路:end()迭代器指向的就是3的下一个元素,那么就是4。再进行reverse操作,最后的结果就应该是1 2 3 6 5 4了。完完全全不是我们所设想的内容!这究竟是怎么回事呢?原创 2023-08-07 20:04:17 · 11959 阅读 · 2 评论 -
【C++】unordered_map在Windows和Linux上的不同行为
我目前手头上的项目,需要编译在板端Linux上运行,但是日常daily调试多在Windows上开发。这就涉及到同一份代码在多平台上的编译个运行。有一次遇到了一个奇怪的现象:跑同样的一份代码,Windows和Linux出来的结果是不一致的。最终确定到不一致的原因出现在unordered_map上,就把这次记录总结下来。这次不一致发生在:处理一个状态序列的投票操作。从编程的角度而言,最适合投票操作的容器就是键值对,key放置投票的内容,value放置投票的次数。在C++中,STL提供了两个相关容器:map和un原创 2023-08-02 20:33:47 · 12529 阅读 · 0 评论 -
【C++】枚举类型作为map/unordered_map的key键
C++中`map`和`unordered_map`提供的是一种键值对容器,在实际开发中会经常用到,它跟Python的字典很类似,所有的数据都是成对出现的,每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值(value)。那么**枚举类型(enum)可以作为键值对容器的key么**?原创 2023-07-24 19:52:56 · 13347 阅读 · 0 评论 -
【C++】泛型算法之std::for_each
用于逐个遍历容器元素,它对迭代器区间所指的每一个元素,执行由单参数函数对象f所定义的操作。它是for循环的一种替代方案。尽管,我们仍可以使用for循环进行一个容器元素的遍历,但是std::for_each额外给我们提供了一种途径,而且丰富了更多的语义信息,在并行上会比朴素的for循环更有优势。原创 2023-07-03 22:10:38 · 12781 阅读 · 0 评论 -
【C++】两个类的相互引用
有时候在设计数据结构的时候,可能会遇到两个类需要相互引用的情形。比如类A有类型为B的成员,而类B又有类型为A的成员。那么这种情形下,两个类的设计上需要注意什么呢?本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2021Q1/20210103。同一文件尝试方案将A和B的定义都放在一个文件中,例如:#include <iostream>class A { public: A()原创 2021-01-03 05:54:29 · 22428 阅读 · 8 评论 -
【C++】空指针调用成员函数及访问成员变量
最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q4/20201231。空指针调用成员函数调用普通成员函数如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序原创 2020-12-31 10:41:59 · 17291 阅读 · 0 评论 -
【C++】模板声明与定义不分离
一般在写C++相关代码的时候,我们总习惯于将类声明和类实现进行分离。也就是说,类的声明一般写在.h文件中,而它的实现一般写在.cpp文件中。但是,在模板类中,这个习惯却要恰恰相反。即:要求模板类的类声明和类实现要都放在头文件,而不能分离。本文就对模板的这个奇特习惯进行分析。本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q4/20201230。分离式编译模式在进行模板特性的讲解之前,首先需要了解一下原创 2020-12-30 11:24:48 · 15647 阅读 · 3 评论 -
【C++】weak_ptr弱引用智能指针详解
weak_ptr这个指针天生一副小弟的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺陷的问题。相比于上一代的智能指针auto_ptr来说,新进老大shared_ptr可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以在C++11的时候将shared_ptr和weak...原创 2020-05-03 15:34:11 · 30812 阅读 · 3 评论 -
【C++】shared_ptr共享型智能指针详解
指针是C/C++区别于其他语言的最强大的语法特性,借助指针,C/C++可以直接操纵内存内容。但是,指针的引入也带来了一些使用上的困难,这要求程序员自己必须手动地对分配申请的内存区进行管理。本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q2/20200427。shared_ptr基本用法智能...原创 2020-04-27 13:36:39 · 33971 阅读 · 2 评论 -
【C++】unique_ptr独占型智能指针详解
指针是C/C++区别于其他语言的最强大的语法特性,借助指针,C/C++可以直接操纵内存内容。但是,指针的引入也带来了一些使用上的困难,这要求程序员自己必须手动地对分配申请的内存区进行管理。本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q2/20200424。unique_ptr基本用法un...原创 2020-04-24 11:03:57 · 23920 阅读 · 1 评论 -
【C++】右值引用、移动语义、完美转发(2/2)
上篇中,主要讲解了右值引用和移动语义的具体定义和用法。在C++11中几乎所有的容器都实现了移动语义,以方便性能优化。本文以C++11容器中的insert方法为例,详细讲解在容器中移动语义是如何提高性能的,同时,在这个过程中STL又解决了什么问题。本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q2...原创 2020-04-18 14:24:14 · 13664 阅读 · 2 评论 -
【C++】右值引用、移动语义、完美转发(1/2)
在C++11,引入了右值引用的概念,在此基础上的移动语义在STL容器中使用非常广泛。简单来说,move语义使得你可以用廉价的move赋值替代昂贵的copy赋值,完美转发使得可以将传来的任意参数转发给其他函数。然而,这些新特性的背后是什么深意和原理呢?将从两篇博文中做详细的介绍。本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tr...原创 2020-04-15 18:56:20 · 15286 阅读 · 1 评论 -
【C++】C++11统一初始化(initializer_list<T>源码分析)
C++11之前的初始化语法很乱,有四种初始化方式,而且每种之前甚至不能相互转换。让人有种剪不断,理还乱的感觉。因此,C++11添加了统一初始化的方式,本文将对统一初始化的语法进行详细讲解。本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q2/20200404。统一初始化几种初始化方式先来看...原创 2020-04-04 18:58:03 · 18025 阅读 · 3 评论 -
【C++】C++11可变参数模板(函数模板、类模板)
在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q2/20200401...原创 2020-04-01 15:37:09 · 32492 阅读 · 4 评论 -
【C++】NULL和nullptr的关联与差别
在写代码的过程中,有时候需要将指针赋值为空指针,以防止野指针。在C中,都是使用NULL来实现的;在C++中,除了NULL之外,还提供了nullptr来进行定义。那么两者之间有什么区别呢,分别适用于什么类型的场景呢?本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q1/20200329。NULL...原创 2020-03-29 19:05:31 · 18450 阅读 · 1 评论 -
【C++】C++11的std::function和std::bind用法详解
在设计回调函数的时候,无可避免地会接触到可回调对象。在C++11中,提供了std::function和std::bind两个方法来对可回调对象进行统一和封装。可调用对象C++中有如下几种可调用对象:函数、函数指针、lambda表达式、bind对象、函数对象。其中lambda表达式和bind对象是C++11标准中提出的(bind机制并不是新标准中首次提出,而是对旧版本中bind1st和bind2...原创 2019-12-23 10:09:44 · 41905 阅读 · 10 评论 -
【C++】C++字符串和数字的拼接
如果你使用过python,你会发现字符串和int/float/double便捷的拼接方式;但如果你使用C++,可能你每次需要的时候搜索一下才能知道。本文提供两种简单的方式来完成这个功能。std::to_string()通过std::to_string()将数字类型转换成std::string类型,从而可以直接使用+完成字符串的拼接。# include <iostream>i...原创 2019-11-27 11:21:18 · 31535 阅读 · 1 评论 -
【C++】C++11的std::array的详细剖析
当学习C++的时候,数组是最基本的结构之一,通常通过以下的方式来定义:int a[5];int *b = new int[5];上面一句是在栈上定义了一个长度为5的数组,下面一句是在堆上定义了一个长度为5的数组,并用一个指针指向它。在C++11中,引入了一种新的数组定义方式std::array。std::array的特性std::array是具有固定大小的数组。因此,它并不支持添加...原创 2019-10-31 09:45:41 · 52358 阅读 · 7 评论 -
【C++】C++函数需要有返回值,但非全分支return(RVO)
今天在review以前的代码的时候,遇到了一个比较奇怪的现象,函数的有返回值,但只在if后面有return,else后面忘写了。但这个版本的代码已经调试验证通过了,没有问题的,这就很怪异。考验一道题下面这道题Print的内容是什么?# include <iostream>class Test { public: Test (int xx, std::string...原创 2019-10-15 09:30:57 · 10281 阅读 · 1 评论 -
【C/C++】令人纠结的getMemory()函数(多种情况详细分析)
如果你将面试一份C/C++的工作,那么无论是笔试题或者面试题都有极大可能会被问到getMemory的问题。当然这也是一道比较纠结的题目,本文就对这几道题目来做一个分析对比。题目一void getMemory( char *p ){ p = (char *) malloc( 100 );} void Test( void ) { char *str = NULL; ...原创 2019-02-28 23:28:24 · 10454 阅读 · 2 评论 -
【C++】面试基础准备(00)
1、extern关键字extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。也就是说,extern有两个作用:当它与"C"一起连用时,如:extern "C" void fun(int a, int b);,则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不...原创 2018-10-07 21:29:42 · 8368 阅读 · 1 评论 -
【C++】C++运算符重载(成员函数实现、友元函数实现)
运算符重载对于面向对象的程序设计来说,运算符重载可以完成两个对象之间的复杂操作,比如两个对象的加法、减法等。运算符重载的原理是:一个运算符只是一个具有特定意义的符号,只要我们告诉编译程序在什么情况下如何去完成特定的操作,而这种操作的本质是通过特定的函数完成的。重载运算符为了重载运算符,首先要定义运算符重载函数,它通常是类的非静态成员函数或者友元函数,运算符的操作数通常也应为对象。定...原创 2018-06-10 20:29:03 · 18643 阅读 · 0 评论 -
【C++】C++类的其他特性(包括:友元函数、虚函数)
本文主要介绍类的友元函数、虚函数、静态成员、const对象和volatile对象以及指向类成员的指针。友元函数从之前的文章可知,当把类中的成员的访问权限定义为私有的或者保护的时,在类的外面,只能通过该类的成员函数来访问这些成员,这是由类的封装性所确定的。这种用法往往觉得不够方便,若把类的成员的访问均定义为公有的访问权限时,又损坏了面向对象的封装性。为此,在C++中提供了友元函数,允许...原创 2018-06-08 21:14:48 · 8795 阅读 · 1 评论 -
【C++】C++继承和派生类、虚基类
从已有的对象类型出发建立一种新的对象类型,使它部分或全部继承原对象的特点和功能,这是面向对象设计方法中的基本特性之一。继承不仅简化了程序设计方法,显著提高了软件的重用性,而且还使得软件更加容易维护。派生则是继承的直接产物,它通过继承已有的一个或多个类来产生一个新的类,通过派生可以创建一种类族。继承基本概念在定义一个类A时,若它使用了一个已定义类B的部分或全部成员,则称类A继承了类...原创 2018-06-07 18:46:17 · 12035 阅读 · 1 评论 -
【C++】C++类和对象、构造函数和析构函数
类类是对某一事物的抽象描述,具体地讲,类是C++中的一种构造的数据类型。它即可包含描述事物的数据,又可包含处理这些数据的函数,类在程序运行时是被用作样板来建立对象的。所以要建立对象,首先必须定义类。定义类定义一个类的一般格式为:class 类名{private:成员表1;public:成员表2;protected:...原创 2018-06-03 20:32:37 · 10061 阅读 · 1 评论 -
【C++】C++基础大杂烩(下篇)
本博客之前有C语言的教程,在C语言的基础上进行C++的学习,会轻松蛮多。此文就简单地将一些不太同的地方进行点一点,主要涉及的章节就是C语言的那几个部分:数据类型、运算符、表达式、输入输出、流程控制、函数、预编译处理、结构体、共同体、枚举、指针和引用。数组1、C++除了基本数据类型之外,还提供了构造数据类型,以满足不同应用的需要。构造数据类型包括:数组、结构体、共同体、类。C语言中没有...原创 2018-05-31 16:02:32 · 7765 阅读 · 0 评论 -
【C++】C++基础大杂烩(上篇)
本博客之前有C语言的教程,在C语言的基础上进行C++的学习,会轻松蛮多。此文就简单地将一些不太同的地方进行点一点,主要涉及的章节就是C语言的那几个部分:数据类型、运算符、表达式、输入输出、流程控制、函数、预编译处理、结构体、共同体、枚举、指针和引用。数据类型、运算符和表达式1、C语言中的头引用#include <stdio.h>,代表着standard input&...原创 2018-05-28 18:19:38 · 8070 阅读 · 0 评论 -
【C】C语言结构体、共用体和枚举
在C语言中,数据类型可分成基本数据类型、构造数据类型、指针数据类型、空类型四大类。本文主要介绍构造数据类型——结构体、共用体。除了这两个之外,还会介绍到枚举。结构体概述结构体是一系列具有相同类型或不同类型的数据构成的数据集合,简称结构。在C语言中,可以定义结构体类型,将多个相关的变量包装成一个整体来使用。在结构体中的变量,可以是相同、部分相同或完全不同的数据类型。结构体类型的定义...原创 2018-05-11 14:22:17 · 11294 阅读 · 3 评论 -
【C】C语言编译与预处理指令
预处理指令C语言规定:源程序中可以加入一些预处理指令。但预处理指令并不是C语言本身的组成部分,编译器不能识别它们,不能直接对这些指令进行编译。在使用时需要以“#”开头,用以与C语言区分。所谓预处理,就是指源程序在进行编译的第一遍扫描(词法分析和语法分析)之前所做的工作由预处理程序完成。当对一个源程序进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理(代替),处理完毕自动进入...原创 2018-05-10 09:50:06 · 9926 阅读 · 0 评论 -
【C】C语言文件(包括:文件各种读写方式)
文件概述文件是指存储在外部存储器上的数据集合。更准确的来说,文件就是一组相关元素或数据的有序集合,而且每个集合都有一个符号化的指代,称这个符号化的指代为文件名。文件类型根据文件在外部存储器上的组织形式,文件可以分为ASCII文件和二进制文件。ASCII文件(文本文件):以字符的方式进行存储,一个字符对应一个ASCII码,而一个ASCII码占用1字节。例如:整数12在内存中占用4个字...原创 2018-05-09 09:52:32 · 51799 阅读 · 7 评论 -
【C】C语言指针(包括:指针与数组、指针与字符串、指针与函数)
指针概述指针的概念在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,例如int型占4个内存单元,char型占1个内存单元。为了正确地访问这些内存单元,必须为每个内存单元编上号,根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这...原创 2018-05-08 17:04:53 · 12293 阅读 · 2 评论 -
【C】C语言函数中的变量(包括:作用域、存储类型)
局部变量和全局变量C语言中变量按其作用域分,可分为局部变量和全局变量,具体的解释为:局部变量(内部变量):在定义它的函数内有效,但是函数返回后失效; 全局变量(外部变量):在所有源文件内均有效。在同源文件的函数中使用使用全局变量,需要将全局变量提前声明;同时在不包含全局变量定义的不同源文件需要用extern关键字再次声明。关于C语言全局变量和局部变量,还有几个注意点:如果在该函数内...原创 2018-05-05 10:11:15 · 18053 阅读 · 2 评论 -
【C】C语言函数(包括:函数编写位置、数组作函数实参)
函数概述函数的分类函数是C语言程序基本的组成单位,每个程序有且只能有一个主函数(main()),其他的函数都是子函数。按照不同的额分类标准,函数可以分成不同的类:函数从是否有返回值,可以将函数分为又返回值和无返回值函数两种; 函数从是否需要参数,可以将函数分为有参和无参函数两种。在函数定义及函数声明时的参数,称为形参;在函数调用时的参数,称为实参。在C语言中,一个函数的函数体中(包...原创 2018-05-05 09:35:47 · 11397 阅读 · 0 评论 -
【C】C语言数组与字符串(包括:字符串与字符数组)
在程序设计中,为了方便处理,通常把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据结构。一个数组可以分解成多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按照数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。本文主要介绍一维数组、二维数组和字符数组,其余的数组将会在以后的文章中介绍到...原创 2018-05-04 09:25:33 · 16150 阅读 · 2 评论 -
【C】C语言基础(包括:运算符、流程控制结构)
运算符和表达式运算符C语言的运算范围很宽,把除了控制语句和输入/输出以外的几乎所有的基本操作都作为运算符处理。运算符主要分为三大类:算术运算符、关系逻辑运算符、按位运算符。根据运算符的运算对象的个数,C语言的运算符又可分成单目运算符、双目运算符、三目运算符。运算符具体分类情况如下表所示:C语言运算符 分类名称 运算符 算术运算符 +、-、*、/、% 关系运算符 ...原创 2018-05-03 14:38:41 · 8255 阅读 · 1 评论 -
【C】C语言基础(包括:关键字、数据类型、输入输出)
程序中的变与不变——变量与常量标识符和关键字标识符:用来标识程序中用到的变量名、函数名、类型名、数组名、文件名以及符号常量名的有效字符序列。语法规则(部分):标识符只能是由英文字母、数字和下划线组成的字符串,并且第一个字符必须为字母或下划线; 标准C语言不限制标识符的长度,但是受到各个版本的C语言编译系统的限制。大多数情况下,标识符的前8位有效,也就是说,如果两个标识符的前8位相...原创 2018-05-02 17:56:00 · 19488 阅读 · 1 评论