C/C++
文章平均质量分 80
chenyuping666
这个作者很懒,什么都没留下…
展开
-
C++中实现简单的Python风格字符串格式化函数
在Python在C++标准库中,看到C++11新的变参模板,发现它可以用来实现一个简单的类似Python风格字符串格式化函数[^1],语法如下:。如果你需要一个丰富的字符串格式化功能,可以考虑使用这个库。原创 2024-02-02 11:15:00 · 1805 阅读 · 0 评论 -
浅谈字符字面量的地址
它们两者虽都是字面量,但是他们两者有一个非常本质的区别,那就是字符字面量有自己的地址而数字字面量没有。个人理解的原因是,C/C++语言中并没有内置字符串这种类型,字符字面量实际上是。这意味着,同一个字符字面量在用指针做比较的时候,得到的结果并不一定相等。那么,同一个字符字面量的值,地址会是一样的吗?,但实际上,上面这个程序的输出是未定义行为,也就是说结果因编译器而异。都是字面量,因为他们没有任何的变量和它对应,直接以值的形式出现在表达式中。定义在不同的文件中,他们的值是不一样的。这个指针变量【1】。原创 2024-02-01 10:15:00 · 438 阅读 · 0 评论 -
C++中构造函数和虚拟函数的微妙关系
构造函数和虚拟函数之间存在许多比较微妙的关系,比如构造函数不能是虚拟函数,构造函 数不能正常调用虚拟函数等等,本文将会讨论产生这些问题的原因。原创 2024-01-30 10:15:00 · 693 阅读 · 0 评论 -
C++中访问私有成员的方法
今天读《Exceptional C++ Style》一书的时候,发现在C++中竟然存在一种合法的方式去 访问对象的私有成员,想起以前和嘉伟讨论过了调用私有函数的问题,猛然发现方法不止 原来一种,这里做一个总结。这三种方法都是使用一个间接层,现在想来果然还是那句老话,没有什么问题是通过间接 层无法解决的。当然,这里说的所有内容,基本上纯属个人找乐子而已,你在实际编码中不到万不得已千 万不要去使用这些方法,它们给程序的安全和耦合性上都有非常大的危害。原创 2024-01-29 11:00:00 · 1147 阅读 · 0 评论 -
C++ STL 容器删除元素最佳实践
在STL容器删除的时候,慎重选择删除元素的方法,一不小心,就容易踩坑,这主要是因为迭代器失效的问题。请看下面这段代码:看起来似乎也没什么问题,编译运行也通过了,然后打印删除后容器的所有元素:咦,怎么里面还有 3 ?这是因为使用 erase 删除元素之后,迭代器 it 已经指向了被删除元素的下一个元素。所以当删除第一个 3 后,it 实际指向了下一个元素 3(或者说元素 3 向前移了一个单位),因此再经历 it++ 后,此时删除的其实是元素 4 ,而上一个元素 3 并没有被删除。此外,如果删除的是原创 2024-01-26 10:30:00 · 387 阅读 · 0 评论 -
使用 Doxygen 生成文档注释
全文是个人关于注释的观点,很可能有误,不想误人子弟,请慎重考虑其中的任何一个观点 ,欢迎拍砖。原创 2024-01-25 10:30:00 · 1086 阅读 · 0 评论 -
一种跨平台的C/C++动态库的符号隐藏方式
在同一个文件中,如果有一些函数我们并不想要让外部访问,我们通常会添加 static 修饰符,把它设置为内部链接属性。但是通常库不太可能是单文件组成,这些文件中有些是做接口给外部使用,有些则单纯的只是库的内部实现。对于外部使用者来说,内部实现的这些符号没有实际的作用,理论上我们完全可以像对待文件内部符号一样把它们统统隐藏掉。但是在语言层面我们并没有相关的语法用于表达这个概念(Java中的包访问权限和C#中的internal类似这个概念)。原创 2024-01-23 10:00:00 · 1060 阅读 · 0 评论 -
匿名命名空间和 static 声明的区别
在C语言中,如果我们想要一个符号只在文件内部(严格来说是编译单元内部,也就是经 过预处理之后得到的源文件)可用,我们需要把它声明成static在C++之所以推荐在C++使用匿名名字空间来取代staticstatic的这个关键词的用途过多,比如你还可以用它声明静态成员,用它声明函数内 部的静态变量。static3. 某些模板的参数必须具有外部链接熟悉,比如下面的代码是不合法的虽然static关键字和匿名命名空间完成了类似是事情,但是这两者之间到底有什么本质 的区别呢?这篇文章的剩余部分会详细说明这个问题。原创 2024-01-22 17:04:38 · 462 阅读 · 0 评论 -
std::bind 的实现原理
C++11 中有一个非常神奇的函数std::bind,它让你可以对函数进行适配,动态的绑定参 数。比如你有一个函数接收两个参数,一个算法接收单参数的,那么通 过std::bind我们可以让两者协同工作。那么这个神奇的bind函数和神奇的占位符到底是怎么实现的呢,它们的工作原理是什么?这个问题困扰我很久,最近在网上找到一篇讲解非常清晰的,这里对其中的 内容做简单的摘要和翻译,希望对于大家理解背后的工作原理会有帮助。原创 2024-01-24 10:30:00 · 964 阅读 · 0 评论 -
C++11 中的 emplace
最近读《C++ 标准库》这本书,发现C++11中大部分的容器对于添加元素除了传统的insert或者之外都提供一个新的函数叫做emplace。比如如果你想要向那么这两种方式的区别到底是什么呢?在《C++标准库》一书中没有给出解释,我查了一 下相关的资料,在此做一个总结。原创 2024-01-22 14:50:06 · 645 阅读 · 1 评论 -
在C++类声明中为什么既包含接口又包含实现
这种方式来自C++的前身,该语言的设计初衷是结合Simula语言在程序组 织上的便利性和C语言本身的高效性。当年C++之父使用Simula写模拟器,发现类的概念非 常好用,但是最终因为Simula本身效率非常的低而不得不使用BCPL语言重写。他发现Simula之所以低效的一个很重要的原因是无法在栈和静态数据区(存放全局变量、 静态变量的区域)中创建用户自定义的对象(其中的原因我不清楚,不过从《C++语言的设 计和演化》一书中的论述来看,应该是因为它把类接口声明和类实现声明分离开来了)。原创 2024-01-22 14:41:05 · 585 阅读 · 0 评论 -
C++轮子(1) · STL 简介
大部分人提到 C++ 标准库的时候首先想到的就是STLSTL的全称是,它背后的技术支撑是模板,由于很多人对于模板本身的不了解,导致很多人对于STL的理解也非常的片面。有些人把STL等同于容器,有些人把STL等同于标准库。C++支持非常多的编程范式【1】,C++标准库中用到的基本上是基于对象和泛型这两种(没错,标准库中面向对象其实非常少,没记错的话,只在异常体系中出现过),很明显STL不等同于C++标准库。那是不是说标准库中的泛型部分就属于STL呢?答案也是否定的。原创 2024-01-17 14:35:31 · 473 阅读 · 0 评论 -
C++轮子(2) · STL 序列容器
想要理解为什么我们说std::queue不是容器,我们需要理解前面我们一直没有讨论的一个问题——什么是容器?public:......在C++范型的世界里,并不存在类似这样的语法元素,定义某一个概念靠的是文本描述(C++后续的版本可能会改善这一点,但是目前最新的版本C++17没有)。这段文本描述称之为concept,它定义来范型世界里面的接口。比如说容器的concept如下:也就是说,标准里面使用这样的文字描述来一个容器应该满足的条件,满足这些条件的就是一个容器。原创 2024-01-17 17:05:15 · 913 阅读 · 0 评论 -
C++轮子(3) · STL关联容器
我们知道 Concept 表示的不是一个类型而是一个类型集合,所以 Refinement 表示的其实也是一个类型集合,这些类型比 Concept 中的定义的类型要有更多的约束和特性(约束和特性其实是一个问题的两个方面,你约束的越是严格,你能够使用的特性越多,但是你能使用的场景越少,比如 Java 中 Object 类哪儿都能用,又哪儿都用不了)。如果你在你的程序中需要查找最吻合的某个值(比如上面例子中的找到给定分辨率最合适的比特率),你可以使用上面提到的这几个函数,它们可以在logn之内找到给定的位置。原创 2024-01-18 19:48:05 · 1087 阅读 · 0 评论 -
C++轮子(4) · STL算法和迭代器
STL的六大组件中最主要的是容器和算法这两个,一个泛化数据的存储,一个泛化数据的操作。前面两篇文章我们简单的介绍了STL中的容器,这篇文章将会介绍STL算法以及粘合容器和算法的迭代器。STL是基于模板实现,容器基于模板类,而算法基于模板函数。在具体介绍算法和迭代器之前,我们先简单的回顾一下模板函数的语法。原创 2024-01-18 19:52:23 · 441 阅读 · 0 评论 -
C++轮子(5) · 函数式编程
和算法配套出现的组件除了迭代器之外还有仿函数,这篇文章会重点介绍仿函数的使用以及和它相关的函数式编程工具。原创 2024-01-19 14:52:39 · 409 阅读 · 0 评论 -
关于 C++ 参数使用指针还是引用的总结
这本书的第一条就是区分指针和引用。它们两者之间的最大区别是引用必须指向某个对象而 指针可以是NULL,此外引用一旦指定不能更改而指针可以。这两个区别点导致引用有更加安全和高效的特性,但是指针却有无可比拟的灵活性。大部分 人出于安全性的考虑会推荐使用引用,这其实也是它设计的主要目的,但是如果你想要灵活 的设计,大部分时候你只能选用指针,比如设计模式种的大部分设计都是使用指针而不是使 用引用。原创 2024-01-22 11:06:44 · 472 阅读 · 0 评论 -
为什么很多人禁用拷贝(复制)构造函数
关于C++的拷贝构造函数,很多的建议是直接禁用。为什么大家会这么建议呢?没有拷贝构 造函数会有什么限制呢?如何禁用拷贝构造呢?这篇文章对这些问题做一个简单的总结。这里讨论的问题以拷贝构造函数为例子,但是通常赋值操作符是通过拷贝构造函数来实现 的( copy-and-swap 技术,详见《Exceptional C++》一书),所以这里讨论也适用于赋 值操作符,通常来说禁用拷贝构造函数的同时也会禁用赋值操作符。原创 2024-01-15 16:07:02 · 1010 阅读 · 0 评论