![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
yishizuofei
You got a dream,you gotla protect it. People can't do something tbemselves, they wanna tell you you can't do it. If you want something, go get it. Period 如果你有梦想的话,就要去捍卫它。当别人做不到的时候,他们就想要告诉你,你也不能。如果你想要些什么,就得去努力争取。就这样!
展开
-
c语言函数调用过程原理及函数栈帧分析
栈是什么(1)简单来说,栈是一种LIFO形式的数据结构,所有的数据都是后进先出。这种形式的数据结构正好满足我们调用函数的方式: 父函数调用子函数,父函数在前,子函数在后;返回时,子函数先返回,父函数后返回。栈支持两种基本操作,push和pop。push将数据压入栈中,pop将栈中的数据弹出并存储到指定寄存器或者内存中。(2)栈的生长方向是从高地址到低地址的,这是因为在下文讲的栈帧中,栈就是原创 2017-10-19 11:41:42 · 4999 阅读 · 2 评论 -
C++中关键字auto和decltype的区别
C++11标准引入了auto和decltype类型说明符,它能让编译器帮我们去分析表达式所属的类型。auto和decltype的主要区别有三个方面:第一,auto类型说明符用编译器计算变量的初始值来推断其类型,而decltype虽然也让编译器分析表达式并得到它的类型,但是不实际计算表达式的值。第二,编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始原创 2017-12-31 17:11:38 · 2285 阅读 · 1 评论 -
C++实现带写时拷贝功能的String类
字符串写时拷贝实现原理: 通过对象的引用计数来减少内存的申请开销,经过拷贝构造或赋值函数得到的所有对象,在还没有对其中某个某个对象进行修改操作时,都共享一个对象的内存。否则,如果原有对象的引用计数大于1时,将会为修改的对象分配新的内存,并在原有的对象引用计数中减一。方法1成员变量是字符指针类型,字符串前四个字节用来存放当前对象被引用的次数。class CString{public: C原创 2018-01-14 20:43:13 · 247 阅读 · 0 评论 -
C++实现带赋值运算符重载函数和迭代器的String类
该类实现了C++中string类中定义的基本方法,可以看出其类似于容器。#include using namespace std;class CString{public: //带一个默认值参数的构造函数 CString(const char *p = NULL) { if (p == NULL) {原创 2018-01-14 21:54:31 · 602 阅读 · 0 评论 -
C++删除字符串中的子串
题目:string str = "62354iijnjnij26758667ijn615468565ij"将子字符串"ijn"全部删除方法1: 该方法有个缺陷,它会将字符串中只要是ijn顺序的字符都会删除 int pos = 0; while ((pos = str.find("ijn")) != -1) { str.erase(pos, 3); }原创 2018-01-14 22:13:57 · 19006 阅读 · 2 评论 -
C++找出字符串中最长的不含重复字符的子串
题目:找字符串中最长的不重复子串 string str = "890123457063788263178548596239785";方法1:使用string和vector //保存不重复的临时子串 string tmp; //保存所有不重复的子串 vectorstring> svec; //记录每次开始查找字符的相对位置 int原创 2018-01-14 22:20:19 · 7667 阅读 · 1 评论 -
C++智能指针scoped_ptr的原理和使用
scoped_ptr是一个类似于auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确的删除。但是scoped_ptr的所有权更加严格,不能转让,一旦scoped_pstr获取了对象的管理权,你就无法再从它那里取回来。正如scoped_ptr(局部指针)名字的含义:这个智能指针只能在作用域里使用,不希望被转让。代码实现如下:转载 2018-01-23 10:35:17 · 15639 阅读 · 2 评论 -
C++智能指针auto_ptr的原理及使用
std::auto_ptr auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII(Resource Application Immediately Initialize),在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。使用auto_pt转载 2018-01-22 21:35:32 · 9938 阅读 · 3 评论 -
C++解决智能指针交叉引用问题
智能指针的交叉引用问题,是如下代码发生的问题,导致的结果是对象无法析构,资源无法释放,问题严重!class B;class A{public: A(){cout<<"A()"<<endl;} ~A(){cout<<"~A()"<<endl;} shared_ptr<B> _ptrb;};转载 2018-02-28 11:15:56 · 2482 阅读 · 1 评论 -
引用和指针的区别
指针和引用都是复合类型,都与内存中实际存在的对象有联系。指针“指向”了内存中的某个对象,而引用“绑定到”内存中的某个对象,它们都实现了对其他对象的间接访问,二者的区别主要有两方面:第一,指针本身就是一个对象,允许赋值和拷贝,而且在指针的生命周期内它可以指向不同的对象;引用不是一个对象,无法令引用重新绑定到另外一个对象。第二,指针无须在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有初原创 2017-12-31 16:45:09 · 203 阅读 · 0 评论 -
C++—volatile、explicit、mutable关键字
转自:http://blog.csdn.net/wendy_keeping/article/details/752011531.volatile关键字volatile是类型修饰符(一致性、原则性、可见性) <1>防止多线程对共享变量进行缓存,保证各线程实时从内存中读取变量值; <2>防止编译器对指令顺序进行调整。 防止CPU对指令顺序进行调整,用barrier()。volatile关键字保证内转载 2017-11-15 20:14:58 · 398 阅读 · 0 评论 -
C++中带默认值参数的函数
函数的默认参数值,即在定义参数的时候同时给它一个初始值。在调用函数的时候,我们可以省略含有默认值的参数。也就是说,如果用户指定了参数值,则使用用户指定的值,否则使用默认参数的值。 例1:int sum(int a = 10,int b = 10){ return a+b;}int main(){ sum(20,10); sum(); //push原创 2017-10-19 17:02:05 · 3283 阅读 · 2 评论 -
C++中内联函数的作用以及与宏代码的区别
内联函数的定义C++中支持内联函数,其目的是为了提高函数的执行效率,用关键字 inline 放在函数定义(非声明)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开。内联函数的作用1、内联函数在编译时直接将函数体插入函数调用的地方。 2、inline只是一种请求,编译器不一定允许这种请求。 3、内联函数省去了普通函数调用时压栈,跳转和返回的开销。 4、内联原创 2017-10-20 11:32:41 · 697 阅读 · 0 评论 -
C++中函数重载的原理
函数重载的定义函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数、参数类型、参数顺序)的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。C语言函数不能重载的原因? C语言使用的编译器是gcc(.c),C++使用的编译器是g++(.cpp),C语言通过编译器生成的函数符号由函原创 2017-10-20 14:36:28 · 463 阅读 · 0 评论 -
const在C语言和C++中的区别
C语言中的const1、const 修饰的只读变量 const修饰的变量是只读变量(常变量),其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。const修饰的变量是不能作左值,也不能用来定义数组长度和用在switch语句中,可以取地址。 3、const 定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const 定义的只读变原创 2017-10-21 19:11:25 · 441 阅读 · 0 评论 -
C++中的引用和指针的区别
相同点都是地址的概念,指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名,可以说引用是更安全的指针。定义和性质区别(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定义了一个整形变量和一个指针变量p,该指针原创 2017-10-21 22:09:24 · 219 阅读 · 0 评论 -
C语言内存模型与指针以及变量的关系
什么是虚拟内存内存模型(内存分区)图 代码示例:#include <stdio.h>int gdata1 = 10;//.dataint gdata2 = 0;//.bssint gdata3;//.bss段进程运行时,操作系统为.bss初始化为0static int gdata4 = 11;//.datastatic int gdata5 = 0;//.bssstatic int gd原创 2017-10-14 15:05:41 · 542 阅读 · 0 评论 -
C语言的翻译环境(编译+链接)
翻译环境在ANSI C的任何一种实现中,存在两种不同的环境。第1种是翻译环境(translation environment),在这个环境里,源代码被转换为可执行的机器指令。第2种是执行环境(execution environment),它用于实际执行代码。翻译阶段由编译和链接过程组成。 编译阶段主要任务:组成一个程序的每个源文件通过编译过程分别转换为目标代码(object code). 该阶段原创 2017-10-14 22:08:50 · 544 阅读 · 0 评论 -
C和C++中标准输入中遇到的问题
C和C++中的标准输入都是库函数,在输入的时候应该注意一些问题。在控制台输入的数据都是字符串,然后通过类型转换存放到变量中。比如scanf和cin都会有一些限制。它们会忽略在第一个非空格或者非换行符之前的空格和换行符,意思是会跳过这些字符,但是如果在非空格字符之后遇到空格或者换行符,就会停止继续读取,可以下次继续读取,而不必输入。但是格式控制符确定了读取的字符是否可以转换想要的值,并存放到指定的变量原创 2017-10-23 20:05:43 · 411 阅读 · 0 评论 -
C++中resize和reserve的区别
首先分清楚两个概念:1.capacity:该值在容器初始化时赋值,指的是容器能够容纳的最大的元素的个数。还不能通过下标等访问,因为此时容器中还没有创建任何对象。2.size:指的是此时容器中实际的元素个数。可以通过下标访问0-(size-1)范围内的对象。就比如说一个瓶子的容量是600ml,意思是它最多可以装600ml,而不是说现在瓶子里就有600ml,这里的600ml就相当于capacit...转载 2019-07-11 10:59:46 · 15467 阅读 · 2 评论