C++
文章平均质量分 58
杂质想当杂志
实践出真实.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
总结c++八股知识
解决方法是以inline的方式完成,如果函数太复杂不适合inline,就会合成一个explicit noninlinestatic实体(Static函数独立于编译单元)。原因不详。“声明”则只是声明这个符号的存在,即告诉编译器,这个符号是在其他文件中定义的,我这里先用着,你链接 的时候再到别的地方去找找看它到底是什么吧。“定义”就是把一个符号完完整整地描述出来:它是变 量还是函数,返回什么类型,需要什么参数等等。函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;原创 2023-02-05 19:32:10 · 741 阅读 · 0 评论 -
右值引用的显式定义后将退化为左值。
注意看代码里注释的报错,可以看出有左值引用将报错,等号右边确实是右值。其次,将左值赋给右值类型也会报错。类型 && 变量名 = 右值。原创 2022-08-16 19:13:52 · 531 阅读 · 0 评论 -
计数安全的C++共享指针实现
https://blog.youkuaiyun.com/solstice/article/details/8547547:讨论共享指针是线程不安全的例子;https://blog.youkuaiyun.com/loreal8/article/details/107617782:讨论计数线程安全。当然了,这个实现其实是很粗暴的,只是一种思想的体现,源码肯定比这复杂的多。断言assert的使用,能够确保空指针的使用。...原创 2022-08-15 23:20:23 · 505 阅读 · 0 评论 -
(转载)C++中的头文件
很显然,答案是不可能。但是有一个很简单地办法,可以帮助程序员们省去记住那么多函数原型的麻烦:我们可以把那几百个函数的声明语句全都先写好,放在一个文件里,等到程序员需要它们的时候,就把这些东西全部copy进他的源代码中。这 个方法固然可行,但还是太麻烦,而且还显得很笨拙。于是,头文件便可以发挥它的作用了。所谓的头文件,其实它的内容跟.cpp文件中的内容是一样的,都是 C++的源代码。但头文件不用被编译。...转载 2022-08-13 22:19:11 · 3025 阅读 · 0 评论 -
(转载)cin、cin.get()、cin.getline()、getline()的区别
由于cin在遇到空格/tab时,就会停止读取,所以如果我在第一次输入时,利用空格隔开两个字符串,那么cin在第一次取的时候,只会读取前一个字符串,到空格结束,此时缓冲区还保留着前面输入的第二个字符串,那么第二次cin就会直接从缓冲区取残留数据,而不会请求输入。其实该函数最常用的方式是这样的,将第一个参数设的非常大,将第二个参数设为'\n',这样就可以缓冲区中回车符中的所有残留数据,因为一般情况下前面输入残留的数据是没有用的,所以在进行新一次输入操作前将缓冲区中所有数据清空是比较合理。...转载 2022-07-22 14:49:39 · 1086 阅读 · 0 评论 -
c++static用法详解与为什么非const静态变量要在类外定义的原因分析
c++static用法详解内容来自于这篇博文,写的很不错,为方便学习static关键字的用法,我复制过来了。后面的为什么非const静态变量要在类外定义的原因分析则是自己增加的内容。static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。 但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。 最后一节加入了c++面向对象中static的使用特性,当作拓展阅...原创 2022-05-01 15:11:12 · 2739 阅读 · 0 评论 -
(转载)c++的常量折叠与const常量
一,前言 有关C++语言的const常量的考察点:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配区是很普通的栈或者全局区域。也就是说const常量只是编译器在编译的时候做检查,根本不存在什么read-only的区域。 所以说C++的const常量和常量字符串是不同的,常量字符串是存储在read-only的区域的,他们的具体的存储区域是不同的。 二,常量折叠 1,举...转载 2022-04-30 09:46:00 · 266 阅读 · 0 评论 -
(转载)为什么 C++ 有指针了还要引用?
今天师弟问我,引用的底层也是指针实现的,内置类型指针传递和引用传递的汇编代码是一样的,那C++为什么还需要引入引用呢? 好吧,仔细想了下,这确实是个好问题。 引用传递,只是明面上,没有使用值传递,值传递本身是不可避免的。 编译器,暗地里通过指针(或者其他可以替代指针的数据类型)的值传递,替换了引用传递。 所以引用传递,实质上是地址传递,别名这东西只是概念,是一种抽象,别名是没法传递的。 别名,可不是真实的数据类型。 因为,函数传递参数需要,数据复制,所以明的暗的值传递,不可避免。 引用的高效,在于对大的数据转载 2022-04-28 15:24:16 · 987 阅读 · 0 评论 -
c++:全局变量、静态变量的静态初始化与动态初始化
参考:https://www.cnblogs.com/dylan-liang/p/14407237.htmlhttps://www.cnblogs.com/fushi/p/7631359.html原创 2022-04-26 14:35:09 · 1111 阅读 · 0 评论 -
默认构造函数、复制构造函数、赋值构造函数
#include <iostream>using namespace std;class Person{ public: Person(int x, int y=0, int z=0):mId(x), mAge(y), test(z){ print(); cout << "Person" << endl; } void operator = (co原创 2022-04-24 23:00:39 · 524 阅读 · 0 评论 -
C++ typeid(*).name()对指针的返回值与指针用法介绍
#include <iostream>#include <typeinfo>using namespace std;int main() { int*(*pp())[3]; int**(*PPP)[3]; double (*FuncPtr)(float); void(Func)(int, float); cout << typeid(pp).name() << endl; cout << type原创 2022-04-20 15:18:41 · 1730 阅读 · 0 评论 -
使用类的operater()当作函数对象的优点
原创 2022-04-19 16:29:41 · 265 阅读 · 0 评论 -
C++如何获取虚函数表(vtbl)的内容及虚成员函数指针存放原理
前言因为不同的运行环境的运行结果是不同的,特别是不同的编译器对c++类对象模型的实现是很可能存在差异,所以有时不同的编译平台的代码不能兼容也是部分原因于此。本文的运行环境是:ubuntu16.04;编译器g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609一些关于指针的知识这篇文章事引用于这篇博客内容其中的虚函数表(vtbl)的内容及函数指针存放顺序,这里针对这部分进行了进一步的分析,为了方便理解本篇文章的内容,对于没基础的人,有必要看下前面这原创 2022-04-19 14:49:09 · 2411 阅读 · 0 评论 -
C++类对象模型之内存布局
1、C++类对象的内存布局 在C++的类对象中,有两种类的成员变量:static和非static,有三种成员函数:static、非static和virtual。那么,它们在C++的内存中是如何分布的呢? C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code area),栈区(stack ...转载 2022-04-18 20:47:29 · 1443 阅读 · 1 评论 -
C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast
http://c.biancheng.net/cpp/biancheng/view/3297.html转载 2022-04-17 23:07:01 · 137 阅读 · 0 评论 -
c++ 数组元素类型为指针情况下,元素地址与元素内容所指向地址的区别
看下面的例子说明以及输出。#include <iostream>using namespace std;int main() { int* a[3]; for (int i = 0; i < 3; ++i) { a[i] = new int{i}; } for (int i = 0; i < 3; ++i) { cout << "数组第" << i << "元素的地址(从栈中分原创 2022-04-17 18:12:55 · 545 阅读 · 0 评论 -
(转载)《C++标准库(第2版)》笔记
来自大佬的笔记,敬礼!!!https://blog.youkuaiyun.com/qq_41453285/category_9816953.html转载 2022-03-27 23:55:51 · 278 阅读 · 0 评论 -
c++11 bind直接绑定未初始化类的成员函数、类对象的operater()的方法与区别
针对标题的两种情况,使用起来有一定的特殊性,特此记录下。至于其他常规的bind使用方法,网上有很多文章有介绍,也可以看这篇文章。标题的两种情况看下面的例子直接学习用法即可,用法也很直观简单,不得不说,C++11的bind的真是太牛叉了!#include <iostream>#include <functional>#include <typeinfo>using namespace std;using namespace placeholders;cl原创 2022-03-27 16:40:22 · 954 阅读 · 0 评论 -
std::condition_variable.wait()的用法和设计缺陷带来的坑
std::condition_variable的用法具体用法参照这篇文章,这里只针对其中的一个成员函数 wait() 的用法进行讨论。成员函数wait()的用法关于wait()的用法,在这篇文章里说到:(2)、wait:当前线程调用wait()后将被阻塞,直到另外某个线程调用notify_*唤醒当前线程;当线程被阻塞时,该函数会自动调用std::mutex的unlock()释放锁,使得其它被阻塞在锁竞争上的线程得以继续执行。一旦当前线程获得通知(notify,通常是另外某个线程调用notify_*原创 2022-03-26 12:54:06 · 13921 阅读 · 14 评论 -
C++11:Default和Delete
目录 引子 默认构造函数 析构函数 默认拷贝构造函数 默认拷贝赋值运算 默认移动构造函数 默认移动赋值函数 default delete C++11之前 C++11实现 引子 default和delete是C++11新添加的关键字,依靠这两个关键字C++编译器可以控制函数的默认生成和删除,这是对C++98标准的很大升级。这儿需要说明的是default仅仅可以控制类的特殊成...转载 2022-03-23 15:54:11 · 1962 阅读 · 0 评论 -
C++前置++和后置++的区别
今天在阅读《google c++ 编程风格》的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理由是 前置自增 (++i) 通常要比后置自增 (i++) 效率更高。于是我查了查前置++和后置++的区别。 注意:《more effe...转载 2022-03-21 17:15:14 · 5047 阅读 · 3 评论 -
C++ 值传递、指针传递、引用传递详解
而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~下文会通过例子详细说明哦值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作引用传递:形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在转载 2022-03-19 00:05:40 · 621 阅读 · 0 评论 -
async(), future, shared_futrue(), wait()的一个综合性例子
先贴例子,具体知识后续补充。。。#include <future>#include <thread>#include <iostream>#include <exception>#include <stdexcept>using namespace std;int& queryNumber (int& num){ // read number cout << "read number:原创 2022-03-18 16:33:42 · 210 阅读 · 0 评论 -
智能指针、单例、多线程三者综合应用+智能指针源码分析
查看文章:https://mp.weixin.qq.com/s/b_xlJF1-Cplgs-uawWuUow转载 2022-03-17 22:40:13 · 155 阅读 · 0 评论 -
(转载)DeepRoute Lab | 【C++性能】你应该拷贝(构造)吗----std::move、完美转发、push_back、push_emplace的理解与应用
查看这篇文章https://mp.weixin.qq.com/s/1pHvbwMru4Pc2iGaWgT-Pw转载 2022-03-17 15:24:12 · 151 阅读 · 0 评论 -
memcpy、memset用法总结
1. memcpy用法说来惭愧,虽然有经常在代码里接触到这个函数,一直以为这个函数的作用是复制内存,今天才发现,是复制内存上每个字节上的内容。具体的信息可以查看下官方文章的描述。通过下面这个例子看看情况:#include <iostream>#include <string>#include <cstring>int main (){ char* data; char* tdata; data = new char[10]; tdata =原创 2022-03-17 13:55:19 · 1322 阅读 · 0 评论 -
利用lambda实现set的自定义排序准则的局限
自定义例子:#include #include #include #include using namespace std;int main(){auto cmp = [](const string& s1, const string& s2) {return s1[0] < s2[0];};set<string, decltype(cmp)> s(cmp);s.insert({“as”, “bs”, “AA”});for (auto&..原创 2022-03-06 12:57:24 · 454 阅读 · 0 评论 -
解决undefined reference to symbol ‘ceil@@GLIBC_2.2.5这类问题的方法
#include <unordered_map>#include <string>#include <iostream>using namespace std;int main(){ unordered_map<string,double> coll { { "tim", 9.9 }, { "struppi", 11.77 }原创 2022-01-21 22:34:32 · 5806 阅读 · 1 评论 -
c++容器中assign()的三种用法
更详细的说明可以查看官方文档。利用的官方文档例子能够说明这三种方法的使用方式:#include <vector>#include <iostream>#include <string> int main(){ std::vector<char> characters; auto print_vector = [&](){ for (char c : characters) s..原创 2022-03-02 21:34:14 · 6415 阅读 · 0 评论 -
std::move与std::forward用于模板函数时,模板参数<T && a>中的参数a退化成左值的探讨
std::move与std::forward的一些知识参考文章里的说法:要认识它的作用,需要知道C++中的几条规则:(这里有篇挺好的文章:http://blog.youkuaiyun.com/zwvista/article/details/6848582,但似乎因标准的更新,其中的规则已不完全成立了)1.引用折叠规则:X& + & => X&X&& + & => X&X& + && => X&X&am原创 2022-02-26 18:36:30 · 432 阅读 · 0 评论 -
(转载)众多C++容器如何挑选?
原文地址:https://blog.youkuaiyun.com/deng821776892/article/details/105663142/ 目录 前言无规律容器vectordequelist&forward_listqueue&stack 有规律容器priority_queue有序关联容器无序关联容器array 选择方法总结 前言 相信大家在学习C++过程中都会学习STL容器,至于容器实现的原理可以去看侯捷老师《STL源码剖析》。网上也有很多资源,为了支持转载 2022-01-23 13:25:04 · 228 阅读 · 0 评论 -
array、vector中data()成员函数的用法
以array容器为例,根据上面图片的描述,data()返回的是首元素的地址(裸指针)。这个对vector也成立。但list和deque有序容器没有提供这个成语函数。可见,data()成员函数只有array、vector提供了。个人猜测,因为只有这两者容器的内存分布是连续的。其他容器的特点可以参考这篇文章。代码示例:#include <iostream>#include <vector>#include <array>#include <list>.原创 2022-01-23 13:19:51 · 2239 阅读 · 2 评论 -
C++标准库学习笔记——标准模板库笔记
目录1. STL组件2. 容器2.1 容器分类2.2 三种容器实现原理2.3 关联式容器的小知识点2.4 容器适配器3. 迭代器3.1 迭代器概念与基本操作3.2 迭代器的半开区间性质3.3 迭代器的小知识点3.4 迭代器种类4. 算法4.1 算法的处理区间1. STL组件由容器、迭代器、算法三部分组成。2. 容器2.1 容器分类分为三类,且每一种包含的类型皆在下图中显示:2.2 三种容器实现原理2.3 关联式容器的小知识点可以认为是“索引是任意类型”的数组。关联式容器会自动排序元原创 2022-01-21 22:24:14 · 517 阅读 · 0 评论 -
(转载)decltype和declval的用法
1. decltype是c++11以后出现的一个新的关键字,是用来萃取表达式或者变量或者函数返回值的类型的。 具体用法可以参考官网:https://en.cppreference.com/w/cpp/language/decltype 2. declval是c++11中的一个模板函数,原型如下: 具体用法可以参考官网:https://zh.cppreference.com/w/cpp/utility/decl...转载 2022-01-16 13:58:07 · 287 阅读 · 0 评论 -
(转载)c++中typename、typedef以及using关键字用法
原文地址:https://blog.youkuaiyun.com/e21105834/article/details/117509758在c++的标准库中,因为类继承关系比较复杂和模板使用比较多的原因,源代码中充斥着typename、typedef和using这三个关键字,所以在继续剖析标准库源码之前,今天就来介绍一下这三个关键字的作用。一、typename关键字 typename的第一个作用是用作模板里面,来声明某种类型,比如这样的: template<typename _Tp, typename _A转载 2022-01-16 12:05:33 · 407 阅读 · 0 评论 -
emplace_back与push_back使用区别,move语义、与vector内存空间开辟弊端
当我们传递一个对象的参数给这两个函数时,分别由如下区别:emplace_back支持直接将构造函数所需的参数传递过去,然后构建一个新的对象出来,然后填充到容器尾部的。push_back首先会利用传入的参数调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。#include <vector>#include <string>#include <iostream>using原创 2022-01-15 17:59:02 · 3744 阅读 · 3 评论 -
typeinfo、typeid、decltype的用法
#include <iostream>#include <typeinfo>int main(){ float a; double b; decltype(a+b) c; std::cout << typeid(decltype(a+b)).name(); return 0;}原创 2022-01-12 21:30:08 · 298 阅读 · 0 评论 -
重载<<报错
重载<<报错:error: ‘std::basic_ostream<_CharT, _Traits>::basic_ostream(const std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits]’ is protected具体可以看:https://coderedirect.com/questions/608505/about-stdostr原创 2022-01-12 21:26:12 · 529 阅读 · 0 评论
分享