C++
永远爱好技术的王师傅
这个作者很懒,什么都没留下…
展开
-
C++智能指针
转载https://www.cnblogs.com/WindSun/p/11444429.html原创 2021-07-25 23:50:48 · 78 阅读 · 1 评论 -
通过虚函数表调用虚函数与通过虚函数表
转载自https://blog.csdn.net/iicy266/article/details/11906807同时转载这样带来的安全性问题:https://blog.csdn.net/haoel/article/details/19480511、通过父类型的指针访问子类自己的虚函数2、访问non-public的虚函数原创 2021-05-13 22:29:41 · 144 阅读 · 0 评论 -
C++类内存分布,包含虚指针
首先类的内存空间大小,只与类中非静态的成员变量(int, char*)和虚函数指针个数有关,其中函数被存放到text区域,静态成员变量存放到.rodata区域,其实也就是数据区上面的只读存储区顺便提一下,类的所有实例化对象共享类的虚函数吧,虚函数表中存放的是虚函数的指针(也就是存放函数的地址),因此虚函数的每一项都是sizeof(pointer)的大小当一个类中有虚函数时,类的内存中首先会存放虚函数表的指针,其次才会存放类中的非静态成员变量class Aarrt{ int a = 1;原创 2021-05-13 22:25:27 · 621 阅读 · 10 评论 -
HTTPS连接过程以及数字证书的理解
HTTPS比HTTP协议多了加密的过程,因为HTTP在网络上传输是明文传输,明文数据会经过中间代理服务器、路由器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,因此需要HTTPS协议进行加密。加密算法总体来说可以分为对称加密和非对称加密对称加密对称加密意思就是 客户端与服务器段拥有相同的密钥K,客户端发送时用K加密,服务器端用K解密。如果由服务器生成一个密钥并传输给浏览器,那在这个传输过程中密钥被别人劫持到手了,之后他就能用密钥解开双方传输的任何内容了。因此对称加密不行。原创 2021-05-08 12:36:02 · 822 阅读 · 2 评论 -
操作系统内存管理
每个进程创建的内存地址都是虚拟地址,操作系统使用了虚拟化技术,让进程觉得它拥有了大块可支配的内存的假象,操作系统拿到这个地址后会将它转变为真实的内存地址,从而拿到对应的信息。比如下面这段代码:#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]){ printf("location of code : %p\n", (void *)main); printf("lo转载 2021-04-30 11:03:19 · 97 阅读 · 0 评论 -
C++ 内存对齐
内存对齐的规则:1、第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)。3、在数据成员完成各自对齐之后,类(结构或联合)本身也要进行对齐,对齐将按照#pragma pa原创 2021-04-30 09:47:15 · 187 阅读 · 0 评论 -
C++ new申请空间失败的判断
C++ new默认申请空间失败是抛出异常的,而malloc申请失败默认是返回空指针方法1、try catch捕获异常try { int *p = new int[10000000000]; } catch (bad_alloc &e) { cout << e.what() << endl; }方法2强制new不抛出异常,这时候会返回空指针int *p = new (std::n原创 2021-04-29 14:48:50 · 1784 阅读 · 0 评论 -
C++ 记住proirity_queue, sort函数中cmp的理解
自定义的sort, stable_sort,map,set,priority_queue等都需要传入自定义的比较函数不同的是,sort,statble_sort可以需要传入比较函数或仿函数map,set,priority_queue需要传入仿函数在定义自己的比较时,常常容易搞混对于比较函数,一句话 为true的放在前面对于priority_queue,大于为小根堆,小于为大根堆1、sort中比较函数此外sort中也可以穿仿函数,比方有个仿函数叫 struct cmp {};.原创 2021-04-19 10:58:39 · 439 阅读 · 0 评论 -
placement new 和 allocator的一些理解
首先我们有一个概念,new操作会执行两部:申请内存和构造函数,也就是说new操作的申请空间和执行构造函数是绑定的,placement new操作(new(p)int)是在给定的p内存上执行构造函数。我理解的给定内存是 甭管你怎么搞到的这块内存,只要这块内存比要new的对象占用的内存大,就可以进行placement new那么给定内存p有几种方式呢静态存储区 栈空间 堆空间1、静态存储区上placement newclass A{public: A() : x(1) {原创 2021-03-14 11:33:54 · 252 阅读 · 0 评论 -
并查集判环
C风格的数组,你是无法知道它的大小的,只能自己去维护在栈上分配的数组可以通过sizeof来知道数组大小,而堆上分配的数组就没办法了int name[5];cout << sizeof(name) / sizeof(int) << endl; //sizeof(name)是整个数组的大小int *p = name;cout << sizeof(p) << endl;int *name2 = new int[5];cout <<.原创 2021-03-08 11:24:23 · 217 阅读 · 0 评论 -
字面常量字符串的一些思考
今天看Cherno的视频,发现const char* name = "www";char name[] = "qw";含义是不同的,第一行的意思是,我们只返回了一个指向字面值字符串内存的指针,这块内存是只读的,所以当我们即使将该指针转为char* 的,我们对内存种的内容进行更改,那也不一定会成功,因为这是一种未定义的行为(意思是C++标准也没说遇到这种情况该怎么做,完全取决于不同的编译器)像我现在使用的是minGW64编译器进行如下操作后const char *name = "123"原创 2021-03-08 09:42:25 · 117 阅读 · 0 评论 -
placement new 理解
两篇好文章博客园和CSDN基本上就是说placement new是指在指定内存上进行对象的构造,这个指定的内存可以堆,栈,静态存储区等等,用完之后要主动调用对象的析构函数,只是清除了这块内存种的内容,并没有释放空间。...原创 2021-03-07 21:22:29 · 138 阅读 · 0 评论 -
为什么说C++引入的强制类型转换比C风格的强制类型转换更安全?
我目前只体会到两种转换更安全,static_cast和dynamic_cast首先static_cast,static_cast只能在有 相互联系的类型 中进行相互转换,这个相互联系就很微妙(我也没去深究)第一种情况,double的指针和int的指针你觉的有关系嘛,虽然说double可以转为int,但是一个指向double的指针去指向int,是不是不太合理,static_cast也觉得不合理hhh可以看到static_cast阻止了这种转换,而C风格的强制转换并没有第二种,是类指针.原创 2021-03-07 17:06:02 · 499 阅读 · 1 评论 -
C++中stringsteam中的str(), clear(), eof(), rdbuf->in_avail()的用法,以及多次使用stringsteam的注意事项
今儿使用stringsteam可是遇到了一个大坑了先把坑贴上来int main(){ stringstream ss; int tmp = 0; ss << "1"; ss >> tmp; cout << tmp << endl; ss << "2"; ss >> tmp; cout << tmp << endl;};大家觉得这两次原创 2021-03-05 22:11:38 · 1932 阅读 · 0 评论 -
C++unordered_set 基本操作
遍历set#include <string>#include <iostream>#include <unordered_set>using namespace std;int main(){ unordered_set<string> set; set.insert("1"); set.insert("2"); set.insert("3"); set.insert("4"); unorde原创 2021-02-03 21:45:25 · 4044 阅读 · 0 评论 -
C++ string按照逗号分隔
除了普通的判断,之外使用stringstream代码string s1("1,2,3");stringstream ss(str);string s2("");while(getline(ss, s2, ',')) { cout << s2 << endl;}原创 2021-02-03 21:41:11 · 3628 阅读 · 0 评论 -
C++中stringstream如何判断流中是否为空
学习自 StackOverflow方法1:ss.rdbuf() -> in_avail()code:#include <sstream>#include <iostream>using namespace std;int main () { stringstream ss; ss << "12"; if (ss.rdbuf() -> in_avail() != 0) { cout <.原创 2021-02-03 19:20:50 · 4623 阅读 · 1 评论 -
C++中类静态数据成员的理解
类静态数据成员是属于类的,不属于某一个对象,因此静态数据并不通过类的构造函数进行初始化。类中静态成员的初始化方式有两种一、类外初始化上代码#include <iostream>using namespace std;class Foo {public: static int a;};int Foo::a = 10;void print(int &v) { cout << v << endl;}int mai原创 2020-12-18 17:07:40 · 642 阅读 · 1 评论 -
C++ 含有可变形参的函数
为了编写能处理可变形参的函数,C++主要有两种方法1、使用可变参数模板2、今天学习的是initializer_list 标准库,适用于参数类型相同,但是参数个数不定的情况直接上代码#include <iostream>#include <string>#include <initializer_list>using namespace std;void print(initializer_list<string> li){原创 2020-12-08 22:08:48 · 253 阅读 · 0 评论 -
C++ inline和constexpr函数可以多次定义问题
首先我们明确,一个普通的函数或者变量可以被多次声明,但只能被定义一次,因此在头文件中一般都只放函数和变量的声明内联函数和constexpr函数可以在程序中多次定义,但是多个定义必须完全一致,因此内联函数和constexpr函数通常定义在头文件中。 ------C++ primer 第五版 215页另外转a.h里定义inline int fun(){ return 1;}在 b.h里定义inline int fun()...原创 2020-12-08 21:46:18 · 1270 阅读 · 0 评论 -
C++ 强制转换的理解
转载自http://blog.sina.com.cn/s/blog_4a84e45b0100f57m.html转载 2020-11-20 23:09:41 · 75 阅读 · 0 评论 -
C++重载istream和ostream
对于一般的运算符重载,可以重载为类的成员函数,这是因为操作符的第一个元素一定是本类的对象(this)例如#include<iostream>using namespace std;class book {public: book (int n):bookNo(n) {} int getBookNo () { return bookNo; } book operator+ (book b) { book result原创 2020-10-19 20:16:05 · 7032 阅读 · 0 评论 -
vs一个项目添加多个property sheet问题
在vs配置opencv pcl等环境时,可以在property manager中新生成一个project property sheet,将配置的内容保存在其中,当别的项目使用时,就可以直接加入已有的配置表,无需重新配置。在一个项目中需要加入多个property sheet时,一定要保证,每一个property sheet在配置的每一项(“VC++目录”->“包含目录”, VC++目录”->“库目录”, “链接器”->“输入”->“附加依赖项”),都要勾选否则会出现新加入的属性原创 2020-09-20 14:20:23 · 637 阅读 · 0 评论 -
C++中inline关键字的解释
https://www.runoob.com/w3cnote/cpp-inline-usage.html原创 2020-09-05 21:43:31 · 145 阅读 · 0 评论 -
C++中explicit关键字的简单解释
https://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.htmlexplicit用来防止由构造函数定义的隐式转换。要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。例如:class things{ public: things(const std::string&name =""): m_nam..原创 2020-09-05 21:42:50 · 208 阅读 · 0 评论 -
C++中重载,重写/覆盖,隐藏
1. 重写/覆盖:派生类中与基类同返回值类型、同名和同参数的虚函数重定义,构成虚函数覆盖,也叫虚函数重写。2. 重载:同一作用域中,同名函数的形式参数(参数个数、类型或者顺序)不同时,构成函数重载。3. 隐藏:不同作用域中,定义的同名函数构成隐藏(不要求函数返回值和函数参数类型相同)。(派生类中与基类同返回值类型、同名和同参数的非虚函数也构成隐藏。)https://blog.csdn.net/zhejfl/article/details/90199200...原创 2020-08-09 15:35:38 · 133 阅读 · 2 评论 -
C++指针与迭代器的区别
1、总的说:1)范围——指针属于迭代器的一种(指针可以用来遍历容器[数组])2)功能——迭代器有着比指针更细的划分并对应能力不同的功能(重载不同的运算符) 比如正向迭代器,双向迭代器,随机迭代器(见迭代器划分)3)行为——迭代器比指针更统一和良好的用法(更轻易使用begin()和end(),不用担心越界)。2、迭代器:1)迭代器不是指针,是类模板,表现的像指针。模拟了指针的一些功能,通过重载了指针的一些操作符,->,++ --等封装了指针,是一个“可遍历STL( Sta...原创 2020-08-06 17:43:50 · 1964 阅读 · 0 评论 -
C++常量存储的位置
https://blog.csdn.net/qq_43152052/article/details/993069671、const修饰的量不是常量,仅仅是个只读量。在编译的时候全部替换const变量被赋予的值(这点和C语言的宏相似),在运行的时候该const变量可通过内存进行修改:1.1)通过内存(指针)可以修改位于栈区的const变量,语法合乎规定,编译运行不会报错,但是在编译的时候所有用到该常量的地方全部被替换成了定义时所赋予的值,然后再运行的时候无法使用通过指针修改后的值。比如 char原创 2020-08-05 23:19:56 · 4711 阅读 · 0 评论 -
C++中size()返回值千万不要和负数作比较
https://blog.csdn.net/LucasDove/article/details/50904725?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight原创 2020-08-03 23:07:09 · 640 阅读 · 0 评论 -
C++中为什么++i比i++高效
i++ 与 ++i 的主要区别有两个:1、 i++ 返回原来的值,++i 返回加1后的值。2、 i++ 不能作为左值,而++i 可以。毫无疑问大家都知道第一点(不清楚的看下下面的实现代码就了然了),我们重点说下第二点。首先解释下什么是左值(以下两段引用自中文维基百科『右值引用』词条)。左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。一般来说,左值是可以放到赋值符号左边的变量。但能否被赋值不是区分左值与右值的依据。比如,C++的const左值是不可赋值的;而原创 2020-07-30 23:01:43 · 334 阅读 · 0 评论 -
C++运算符重载
转载自 这里运算符重载有两种方式:一种是类内重载(运算符重载函数作为类的成员函数),另一种是类外重载(运算符重载函数作为类的友元函数)类内重载#include <iostream>using namespace std;class Point{public: Point(){}; Point (int x, int y): x(x),y(y) {}; Point operator+(const Point &a){ //类内重载,运算符重载函原创 2020-07-30 22:54:31 · 81 阅读 · 0 评论 -
C++友元以及前向声明
转载自这里知识点5.1前向声明在C++里面可以声明一个类而不定义它。这个声明被称为前向声明(forward declaration)。 在声明之后,定义之前,这个类是一个不完全类型(incompete type),即已知它是一个类型,但不知道包含哪些成员,具有哪些操作。 不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。当一个类的成员变量是引用时,需要在初始化列表中初始化引用,.原创 2020-07-30 22:24:52 · 701 阅读 · 0 评论 -
C++中public、protected及private继承
转载这里在设计基类时,对于某些成员变量基类设计者A也不知道其他人会怎么使用,假如A一开始将成员变量a定义为private,当其他人过来继承时需要一个a++的操作,那么他就不得不去找A让他改基类的定义,不然在继承类中无法直接操作基类的私有成员。过了一会儿又有人需要一个a--操作,那么A又要改基类定义添加一个a--的public成员函数,当然后面还有各种需求。。所以A很无奈,于是就出现了protect,对于继承者而言,你们随便操作不用再来麻烦我。这样即保证了数据的私有性(不能被对象获取),同时基类设计者..原创 2020-07-30 21:25:13 · 1320 阅读 · 0 评论 -
C++派生类隐式调用与显式调用基类的构造函数
转载这里1. 基类构造函数和派生类构造函数顺序 当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象。当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数。简而言之,就是说,构造函数:基类->派生类。析构函数:派生类->基类。2,通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种。所谓隐式方式就是在派生类的构造函数中不指定对应的基类的...原创 2020-07-30 19:23:56 · 1207 阅读 · 0 评论 -
C++ unordered_map
转载自这里目录查找元素迭代器容量修改操作通接口哈希策略观察器std::swap(std::unordered_map)std::erase_if(std::unordered_map)简介本篇博客介绍C++常用的无序关联容器unordered_map。unordered_map是C++11正式加入的对hash_map的官方实现(之前标准C++没有hash_map的官方实现,我们使用的STL的hash_map并不是官方的)。从名字可以看出这个结构是无序的,底..原创 2020-07-30 12:22:36 · 21715 阅读 · 1 评论 -
C++并查集
转自原文链接来看一个实例,杭电1232畅通工程首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支。如果是1个连通分支,说明整幅图上的点都连起来了,不用再修路了;如果是2个连通分支,则只要再修1条路,从两个分支中各选一个点,把它们连起来,那么所有的点都是连起来.原创 2020-07-28 19:16:11 · 2736 阅读 · 0 评论 -
C++中std::function 函数对象类
转载自https://blog.csdn.net/ailiao7104/article/details/102071951?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-.原创 2020-07-28 18:40:23 · 2080 阅读 · 0 评论 -
C++中lambda匿名函数
转载https://www.cnblogs.com/yaya12138/p/11815475.htmlC++匿名函数的使用c++匿名函数使用方法#1、匿名函数的使用#匿名函数的基本语法为:Copy//[捕获列表](参数列表)->返回类型{函数体} int main() { auto Add = [](int a, int b)->int { return a + b; }; std::cout << Add(1, 2) << std::e.原创 2020-07-28 00:27:52 · 114 阅读 · 0 评论 -
C++ 反向迭代器
转载:https://blog.csdn.net/kjing/article/details/6936325转载 2019-05-18 17:20:46 · 203 阅读 · 0 评论 -
C++中防函数 及 容器中find,find_if函数用法
转载:仿函数用法https://www.cnblogs.com/decade-dnbc66/p/5347088.html转载:find及find_if用法https://blog.csdn.net/yockie/article/details/15810667转载 2019-05-18 17:18:04 · 802 阅读 · 0 评论