C++
文章平均质量分 64
生若直木,不语斧凿ᝰ
口红都买不起谈什么恋爱
展开
-
C++中局部变量可否与全局变量重名
此问题研究的是变量的作用域的问题。一个声明将一个名字引进一个作用域;局部变量(通常在函数中定义)的作用域是从声明的那一点开始,直到这个声明所在的块结束为止(一个块就是由{}围起来的一段代码)。全局变量(在所有函数、类、命名空间之外定义)的作用域从声明的那一点开始,直到这个声明所在的文件的结束。与全局变量重名的局部变量可以屏蔽全局变量,如果想在块内使用全局变量需要通过作用域解析运算符...原创 2019-01-19 14:11:31 · 3241 阅读 · 1 评论 -
STL之顺序容器
顺序容器vector#include <iostream>using namespace std;#include <vector>template<typename container>void show(container &rhs){ container::iterator it = rhs.begin(); while(i...原创 2019-08-13 15:21:25 · 209 阅读 · 0 评论 -
STL之关联容器
1.set单重集合:不允许key重复 set作为一个容器,也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据;C++ STL中标准关联容器set, multiset, map,multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树自动排序:在set中每个元素的值都唯一,而且系统默认的比较函数(小于函数)能根据元素的值自动进行排序(也可以自定义)。 ...原创 2019-08-13 16:08:40 · 170 阅读 · 0 评论 -
写时拷贝——string类
浅拷贝使多个对象共用一块内存地址,调用析构函数时导致一块内存被多次释放,导致程序奔溃。实现string类的时候通常显示的定义拷贝构造函数和运算符重载函数。在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间。这种就是写时拷贝。在构造函数中开辟新的空间时多开辟4个字节的空间,放在内存单元首部,用来存放引用计数器,记录这快空间的引用...原创 2019-08-18 20:00:42 · 196 阅读 · 0 评论 -
单例模式
单例模式的设计思路就是一个类只产生一个对象具体只如何只产生一个对象,自然要从对象如何生成说起,新对象的生成一般通过类的构造函数/拷贝构造函数生成,所以应该将这两个函数屏蔽起来,具体的操作就是将这两个函数的声明写在该类的私有访问限定符下。此外只有指针和引用不生成对象,所以接口生成的对象我们用引用或者指针返回,避免静态成员方法(不依赖对象调动)生成对象或返回一个类类型,为了方便唯一对象对静态方法的调...原创 2019-08-14 11:13:47 · 119 阅读 · 0 评论 -
智能指针
针对C++没有实现自己的内存回收机制,所以它引入了智能指针进行内存回收,力求做到内存由用户开辟,系统回收这样就能最大程度避免内存泄漏的发生。具体做法是以智能指针(类)生成一个对象(栈上生成)对开辟的内存(堆上)进行自主回收管理。C ++ 98 中引入了auto_ptr智能指针,其宗旨是维护内存所有权的唯一性,具体的做法就是对一个已经开辟内存块只能有一个智能指针指向,如果有新的智能指针对象指向该...原创 2019-08-09 21:09:56 · 220 阅读 · 0 评论 -
工厂模式/抽象工厂模式
工厂模式:该模式的设计思路是简化类名和屏蔽对象的生成细节简化一个事物有很多种方法,也就是换一个容易记住的称呼,最简单的当然就是数字作为代号,但需要使用某个具体类的功能时就指出它的代号,让它生产对象并调用它的成员方法,这样使用者就不必关心对象的生成细节。生成的对象一般以指针的形式返回(方便对对象内部成员方法的调用)。这就和工厂生产产品很像,机器都有编号,一个机器生产一种产品,使用者只用找对机器编号...原创 2019-08-14 11:43:22 · 136 阅读 · 0 评论 -
Observer模式
Observer 模式应该可以说是应用最多、影响最广的模式之一,因为 Observer 的一个实例 Model/View/Control( MVC) 结构在系统开发架构设计中有着很重要的地位和意义, MVC实现了业务逻辑和表示层的解耦。设计Observer 模式要解决的问题为: 建立一个Subject对多个Observer的依赖关系, 并且做到当“一” 变化的时候, 依赖这个“一”的多也能...原创 2019-08-14 14:17:03 · 621 阅读 · 0 评论 -
Template 模式和Strategy 模式
应用场景:在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现) 在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。 Template 提供了这种情况的一个实现框架。Template模式是采用继承的方式作为强制约束实现这一点:将逻辑(算法)框架放在抽象基类中, 并定义好细节的接口,子类中实现细节。Strategy 模式解决的...原创 2019-08-14 19:36:36 · 262 阅读 · 0 评论 -
值传递问题——GetMemory
指针的错误使用往往造成意想不到的错误,导致程序崩溃、数组越界、野指针的产生,一般都是因为: (1)野指针的使用,不使用了未置空; (2)动态内存申请未释放; (3)指针的值传递导致访问出错; (4)malloc申请内存后未进行出错检查; ...原创 2019-08-18 10:36:35 · 442 阅读 · 0 评论 -
同名函数之间的关系
在C++中同名函数存在如下三种关系:函数重载/重定义:指的是在同作用域下,由函数参数列表(参数类型、参数个数、参数顺序)提供支持的多个同名函数同时存在的一种关系;int sum(int a,int b){ return a+b;}int sum(int a,int b,int c){ return a+b+c;} double sum(double a,doubl...原创 2019-08-02 15:30:47 · 1893 阅读 · 0 评论 -
STL
标准模板库(Standard Template Library,STL)是一些“容器”的集合,这些“容器”有list,vector,set,map等,也是算法和其他一些组件的集合。STL的代码广义上分为algorithm算法,container容器,iterator迭代器;几乎所有代码采用模板类和模板函数的方式,为的是更好的代码重用。在C++标准中,STL被组织为下面的13个头文件:<a...原创 2019-08-13 14:12:02 · 161 阅读 · 3 评论 -
宏定义和内联函数的区别
一、宏定义和内联函数的区别1. 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。2. 宏定义...原创 2019-03-08 22:10:19 · 6692 阅读 · 0 评论 -
字符串分割split
1.单个符号作为分隔符(^ . | * :)String address=”上海|上海市|闵行区|吴中路”;String[] splitAddress=address.split(“\\|”); //如果以竖线为分隔符,则split的时候需要加上两个斜杠【\\】进行转义(split表达式,其实就是一个正则表达式。* ...原创 2019-01-07 14:41:28 · 364 阅读 · 0 评论 -
C++类和对象中6个默认函数
特点:自己不提供时,由系统提供,所有系统提供的函数都是共有的、内联的;系统提供的函数调用是无参数列表的,且自动调用。自己提供时、系统不再提供。1、构造函数2、析构函数3、拷贝构造函数4、赋值运算符的重载函数5、取地址操作符的重载函数6、const修饰的取地址的操作符的重载函数对象的生成步骤:1、开辟内存2、内存空间的初始化1、构造函数:构造函数和类名相同...原创 2018-12-06 14:43:02 · 145 阅读 · 0 评论 -
C/C++内存的开辟与销毁
一. C语言中的动态内存的开辟与销毁方式:1.开辟:(1)只能用内存开辟函数开辟,函数原型为void *malloc(size_t size),我们需要传入的参数就是开辟内存的大小。int* p = (int*)malloc(sizeof(int)*4);//开辟4个int大小的堆内存,也就是16个字节的内存空间a.这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针...原创 2018-11-23 21:34:02 · 3402 阅读 · 0 评论 -
函数调用约定
函数调用约定当一个函数被调用时,函数的参数会被传递给调用的函数和返回值会被返回给调用函数。函数调用约定就是描述参数是怎么传递和由谁平衡堆栈的,当然还有返回值。一 .__cdecl:标准调用约定1.参数是从右向左传递的,也是从右向左放在堆栈中的2.堆栈平衡是由调用函数来执行的3.函数符号生成时前面会加一个前缀_(_Test)二.__stdcall:windows下的标准调用约...原创 2018-11-22 16:50:31 · 159 阅读 · 0 评论 -
函数堆栈调用
在一个程序中中,函数的堆栈调用时必不可少的,在调用过程中,形参内存一般由调用方开辟和释放;函数参数的入栈顺序一般是从右到左(方便知道参数额个数),函数的返回值是由寄存器带出(1字节<=n<=8字节),栈底指针寄存器ebp在函数调用时压栈,调用后会会退到原来栈底的位置。下面介绍几个反汇编的指令:1.移值 :mov dword ptr[ebp-4],14h 将某个...原创 2018-11-17 23:38:33 · 691 阅读 · 0 评论 -
static 与const的用法
一.static的作用:对变量:1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。1)内存中的位置:静态存储区2)初始化:未经初始化的全局静态变量会被程序自动初始化为03)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置(从原来的栈...原创 2019-01-19 14:40:19 · 890 阅读 · 0 评论 -
C++零碎知识点
1.非类类型的函数返回值的接收方式:(1)小于4字节:eax寄存器接收。(2)大于4字节小于8字节:eax寄存器和edx寄存器配合接收。(3)大于8字节:由调用方从被调用方的数据拷贝而来(副本),再由临时变量带出。2.const的用法:(1)除声明以外一定要初始化,修饰的是常量,不可由普通指针指向。(2)修饰的是直接右边,例如:const int *p=&a; ...原创 2018-11-11 21:37:03 · 155 阅读 · 0 评论 -
面向对象思想
面向对象思想(1)面向过程:强调的是每一个方法功能的实现。(2)面向对象:面向对象是基于面向过程的编程思想,强调的是对象,然后由对象去调用方法功能。面向对象思想认为万物皆为对象,因为任何事物(单个事物就可以理解为实体)无非两大特征:属性和行为;当我们把它封装成类是就给他起了个新名字叫成员变量(属性)和成员方法(行为)。然后对类进行实例化成为对象,运用对象调用成员方法展示对象的行为特征,如下...原创 2019-07-28 13:25:36 · 151 阅读 · 0 评论 -
联合体的妙用——判断系统大小端——打印IP地址
目录利用联合体打印IP地址利用联合体判断大小端利用联合体打印IP地址一般处理void PrintIP(unsigned int ip){ int i = 0; int a =0; for(i = 0;i<4;++i) { a = ip & 0x0ff; printf("%d",a); ip>>= 8; i...原创 2019-08-30 13:54:47 · 395 阅读 · 0 评论