C++
文章平均质量分 79
Gordennizaicunzai
这个作者很懒,什么都没留下…
展开
-
c++ unordered_set的用法
C++11为STL标准库增添了4种无序(哈希)容器,本节讲解unordered_set容器unordered_set容器,可直译为“无序set容器”,即unordered_set容器和set容器很像,唯一的区别就在于set容器会自行对存储的数据进行排序,而unordered_set容器不会。不仅如此,由于unordered_set容器内部存储的元素值不能被修改,因此无论使用那个迭代器方法获得的迭代器,都不能用于修改容器中元素的值。...转载 2022-07-26 22:10:04 · 1412 阅读 · 1 评论 -
C语言结构体位域详解
一、C语言位域是什么?有时候,信息存储的时候,并不需要一个完整的字节,而只需占几个或一个二进制位就能满足需求。例如存放一个bool类型的变量,只需要true或者false即可,这种情况下,只需要0或者1一位二进制位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。二、位域详解转载 2022-05-06 22:20:25 · 3341 阅读 · 1 评论 -
有符号数和无符号数详解(2)补码详解
补码是先求原码的反码,然后在反码的末尾位加1后得到结果,即补码是反码+1。补码的优点它的便利体现在,所有的加法运算可以使用同一种电路完成。转载 2022-05-01 21:19:23 · 1094 阅读 · 0 评论 -
有符号数和无符号数详解
原码:就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。反码:正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。补码:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。转载 2022-05-01 21:11:15 · 2985 阅读 · 0 评论 -
C/C++ typedef用法详解(真的很详细)
第一、四个用途用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:char *pa, *pb;也可...转载 2018-05-20 20:39:30 · 540 阅读 · 0 评论 -
C/C++宏定义中#和##的使用方法
单井号(#)在宏定义中,不展开参数,直接替换,作用是把传递过来的参数当成字符串进行替换。双井号(##)又称连接符,它的作用是将参数和前面或后面的子串连接起来,成为一个新的子串。/////////////////////////////////////////////////////////////////////////////// The one and only applicatio原创 2018-04-07 20:59:55 · 483 阅读 · 0 评论 -
size_t类型总结
1、sizeof返回的必定是无符号整形,在标准c中通过 typedef 将返回值类型定义为size_t. 若用printf输出size_t类型时,C99中定义格式符%zd;若编译器不支持可以尝试%u或%lu. sizeof,获取操作数占用的内存空间字节数,返回类型size_t; strlen,获取字符数组实际使用的字节数,不包含数组结尾符’\0’,返回类型size_t。2、它是转载 2018-03-05 19:28:10 · 378 阅读 · 0 评论 -
C/C++字节对齐
一、字节对其概念: 如果一个变量的内存地址正好位于它长度的整数倍,它就被称做自然对齐。计算机中内存空间字节(byte)划分,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是对齐。比如在32位cpu下,假设一个整型变量的地址为0x000原创 2016-11-05 23:39:24 · 798 阅读 · 0 评论 -
c++常见面试题30道
转自:http://blog.csdn.net/shihui512/article/details/9092439;1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放转载 2017-09-10 17:18:02 · 343 阅读 · 0 评论 -
面试题——C/C++经典问题,及面试笔试题
c语言中指针变量可以相加吗?其含义是什么?指针变量是有加减运算的,但是要注意以下几点:1.指针变量中存放的是地址值,也就是一个数字地址,例如某指针变量中的值是0x20000000,表示表示此指针变量存放的是内存中位于0x20000000地方的内存地址。指针变量可以加减,但是只能与整型数据加减,此时加减的含义并不是其地址值进行了加减,也就是说如果指针变量p的值是0x20000000,那么p=p+转载 2017-09-10 17:28:00 · 803 阅读 · 0 评论 -
C++避免野指针
C++使用new 一个指针后,用delete删除,如果是new [],那么用delete []删除,是的,大家都知道,但不要忘了,删除指针之后,还要给指针赋值NULL,避免误用了野指针。int main(int argc, char* argv[]){ int *ip1; int i100 = 100; ip1 = new int; *ip1 = 100; cout << "*ip原创 2017-12-24 22:02:49 · 1276 阅读 · 0 评论 -
C/C++宏定义连接符“\”
在C/C++宏定义中规定,宏定义只允许写在同一行,下一行就不属于这个宏定义了,而实际定义宏过程中,经常会出现较复杂的宏定义,较长,写在一行不易于读懂,需按逻辑关系断行编写,此时需要在行的末尾用连接符“\”进行连接,表示上下行属于同一行,即同属于这个宏定义。// Connector.cpp : Defines the entry point for the console appli...原创 2018-05-27 21:51:54 · 2269 阅读 · 0 评论 -
C/C++ offsetof
offsetofRetrieves the offset of a member from the beginning of its parent structure.返回结构成员相对于结构开头的字节偏移量。size_t offsetof( structName, memberName );RoutineRequired HeaderCompatibilityoffsetof<stddef....原创 2018-07-08 16:25:31 · 684 阅读 · 0 评论 -
C/C++结构体的正确打开方式
简单的C/C++结构体,一般就定义数据成员,而已,如:struct S_Book{ CString csName; CString csAuthor; float fPrice; short int nVersion;}; 这熟悉的代码在很多程序里面都能看到,因为很多程序员都是这样写的。那么,有问题吗?一般场景没有问题,然而对应稍微复杂些...原创 2018-08-02 00:40:48 · 411 阅读 · 0 评论 -
C/C++ assert()函数用法总结
1. 简介assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。原型定义:#include <assert.h>void assert( int expression );assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abo...转载 2018-11-21 22:29:50 · 286 阅读 · 0 评论 -
【c++】i++和++i 详解
【c++】i++和++i 详解 参考:前++(--)和后++(--)的区别 https://blog.csdn.net/u011321104/article/details/9280879《c++ Primer中文版》Stanley B Lippman 等著 1.小引 递增 ++ 和递减-- 操作符为对象加 1或减 1 操作提供了方便简短的表示它们最一般的用法是对...转载 2018-12-22 20:56:20 · 448 阅读 · 0 评论 -
C++换行
编写代码时遇到代码超长的情况,为了代码的美观及方便调试,需要涉及到代码的换行问题。以下讨论了几种情况: 1、#define宏#define MAX(a,b) \ ((a) < (b) ? (b) : (a)) 等价于#define MAX(a,b) ((a) <(b) ? (b) : (a)) 2、关键字的换行关键字换行支持:+ - * /...转载 2019-01-02 23:56:48 · 6646 阅读 · 0 评论 -
C++ vector
一、向量的介绍 向量vector是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。 在使用它时, 需要包含头文件 vector,#include<vector>...转载 2019-05-27 22:00:48 · 145 阅读 · 0 评论 -
OD调试2----破解序列号验证程序
本文所用实验效果图如下,输入用户名和序列号,点击check:首先我们来分析一下这个程序的运用流程,我们的目的就是让其跳过错误的对话框,跳出正确对话框。那我们就要找到何处调用的这个函数。第一步,按F3加载程序。进入界面后,按F8运行程序,输入用户名和序列号。如下图:然后点击check,程序会跳转到算法匹配,也就是验证用户名和序列号的地方。我们可以看到这个这个...转载 2019-06-23 23:56:35 · 1636 阅读 · 1 评论 -
C++中enum与字符串或CString互相转换的方法
C++中没有专门为enum与字符串或CString互相转换的直接方法,但是工作中会常遇到相互转换的场景。下面介绍一种自己实现的方法,首先得定义一个enum类型,同时,定义一个与之对应的字符串类型,然后,可以相互转换了。enum E_ANIMAL { E_ANIMAL_EAGLE = 0, E_ANIMAL_MAGPIE, E_ANIMAL_PIG, E_ANIMAL_CARP,原创 2017-11-29 23:56:13 · 10577 阅读 · 0 评论 -
__stdcall,_stdcall,__cdecl,_cdecl,__fastcall,_fastcall区别简介
1. 今天写线程函数时,发现msdn中对ThreadProc的定义有要求:DWORD WINAPI ThreadProc(LPVOID lpParameter); 不解为什么要用WINAPI宏定义,查了后发现下面的定义。于是乎需要区别__stdcall和__cdecl两者的区别; #define CALLBACK __stdcall #define WINAPI __stdca转载 2017-09-17 20:56:36 · 488 阅读 · 0 评论 -
对深拷贝与浅拷贝的再次理解
先说下自己的理解吧,浅拷贝,即在定义一个类A,使用类似A obj; A obj1(obj);或者A obj1 = obj; 时候,由于没有自定义拷贝构造函数,C++编译器自动会产生一个默认的拷贝构造函数。这个默认的拷贝构造函数采用的是“位拷贝”(浅拷贝),而非“值拷贝”(深拷贝)的方式,如果类中含有指针变量,默认的拷贝构造函数必定出错。 用一句简单的话来说就是浅拷贝,只是对指针的拷贝,拷贝后两个转载 2016-01-20 20:42:33 · 483 阅读 · 0 评论 -
continue、break和return
C/C++中,continue、break和return语句都是函数中一个重要的语句,continue提前结束本次循环进行下一次循环,break在循环体中使用时跳出循环体,如果是内循环体使用则跳出内循环体,回到外循环体继续执行,return语句用于结束当前正在执行的函数,并将控制权返回给调用此函数的函数。return语句有两种形式:return;return转载 2016-06-16 22:10:32 · 707 阅读 · 0 评论 -
const
在C++面向对象程序设计中,经常用常指针和常引用作函数参数,这样既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝,节省时间开销,提高程序运行效率。 const修饰数据类型后为常数据类型,可修饰内部数据类型(指int、long、char等c++自带数据类型)和外部数据类型(指自定义的数据类型如类、结构体等),常数据类型是不可改变的,合理使用可以提高程序健壮性。原创 2016-07-03 22:27:24 · 940 阅读 · 0 评论 -
enum
1、为什么要用enum 写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等。 更常见的,打开一个文件可能有三种状态:input, output和append. 典型做法是,对应定义3个常数,即: const int input = 1;转载 2016-07-31 10:24:29 · 464 阅读 · 0 评论 -
C++ this指针
C++ Specific —>The this pointer is a pointer accessible only within the member functions of aclass, struct, or union type. It points to the object for which the member function is called. Static m转载 2016-07-31 20:16:33 · 550 阅读 · 0 评论 -
Virtual
c++多态性分为两类:静态多态性和动态多态性。静态多态性又称编译时多态性,是通过函数重载实现的,特点是函数调用速度快、效率高,但缺乏灵活性,在程序运行前就已经决定了执行的函数和方法。动态多态性又称运行时多态性,是通过虚函数(virtual function)实现的,特点是不在编译时确定调用的是哪个函数,而是在程序运行过程中才动态地确定操作所针对的对象。#include "StdAfx.h"#原创 2016-08-02 17:20:48 · 476 阅读 · 0 评论 -
C++ delete和delete[]
在C++中回收用new分配的单个对象的内存空间的时候用delete,回收用new[]分配的一组对象的内存空间的时候用 delete[]。关于 new[]和delete[],其中又分为两种情况:(1)为基本数据类型分配和回收空间;(2)为自定义类型分配和回收空间。#include "stdafx.h"#include ;using namespace std; class T1原创 2016-10-23 23:10:04 · 534 阅读 · 0 评论 -
堆和栈的区别
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两转载 2016-11-05 20:12:45 · 372 阅读 · 0 评论 -
模板类与类模板、函数模板与模板函数等的区别
在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替换混淆使用。下面我想彻底辨清几个术语,这样就可以避免很多概念上的混淆和使用上的错误。 这几个词是: 函数指针——指针函数 数组指针——指针数组 类模板——模板类 函数模板——模板函数 最终在使用中,我们就可以让它们实至名归,名正言顺。 1.函数指针——指针函数转载 2016-01-20 19:53:11 · 442 阅读 · 0 评论 -
解析C++中四种强制类型转换的区别详解
C++的四种强制类型转换,所以C++不是类型安全的。分别为:dynamic_cast 最安全(上行转换安全,下行转换不太安全),运行时处理,开销大。static_cast 较为安全,编译时处理,效率高。const_cast 不安全,改变const,编译时处理,效率高。reinterpret_cast 不安全,可以转换所有数据,和C一样,编译时处理,效率高。为什么转载 2016-01-19 18:40:18 · 543 阅读 · 0 评论 -
Typedef Struct 用法详解和用法小结
第一篇:typedef struct与struct的区别1. 基本解释typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。至于typedef有什转载 2016-01-18 23:43:58 · 700 阅读 · 0 评论 -
C++ void*指针、多重指针void**和指针大小
一、定义: 用void* 定义一个void类型的指针,它不指向任何类型的数据,意思是,void*指针“指向空类型”或“不指向确定的类型”,而不要理解为void*指针能指向“任何的类型”数据。简而言之:void*只提供一个地址,没有指向。二、作用: void*指针不指向任何数据类型,它属于一种未确定类型的过渡型数据,因此如果要访问实际存在的数据原创 2017-09-16 23:31:10 · 20638 阅读 · 1 评论 -
C++类静态成员与类静态成员函数详解
静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,转载 2017-08-26 12:21:18 · 375 阅读 · 0 评论 -
C/C++内存管理详解
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C转载 2017-08-13 21:49:37 · 314 阅读 · 0 评论 -
C++接口实现总结(Interface)
网上的例子,稍微有点错误。我给更改一下,附件上有源码!如有错误,请指正。总结一下C++实现接口的技巧。 面向对象的语言诸如JAVA提供了Interface来实现接口,但C++却没有这样一个东西,尽管C++ 通过纯虚基类实现接口,譬如COM的C++实现就是通过纯虚基类实现的(当然MFC的COM实现用了嵌套类),但我们更愿意看到一个诸如 Interface的东西。下面转载 2017-07-24 23:07:12 · 11131 阅读 · 1 评论 -
C++ Iterator迭代器介绍
迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针。举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历。有这么几种迭代器如下:迭代器 描述 input_iterator 提供读功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*)。output_iterator 提供写功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(转载 2017-05-31 20:00:56 · 813 阅读 · 0 评论 -
C++中重载、重写(覆盖)和隐藏的区别实例分析
这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下 本文实例讲述了C++中重载、重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念。具体分析如下:1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不转载 2016-01-20 20:07:44 · 673 阅读 · 0 评论 -
C++中的引用与指针的区别
C++中的引用与指针的区别 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化。 ★ 相同点: 1. 都是地址的概念; 指针指向一转载 2015-10-28 23:35:56 · 458 阅读 · 0 评论 -
指针函数与函数指针
【指针函数】 一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。 返回指针的函数,一般定义格式为: 类型标识符 *函数名(参数表)int *f(x,y);或写成int* f(x,y);让指针标志 * 与int紧贴在一起,而与函数名f间隔开,这样看起来就明了些转载 2015-10-30 22:35:59 · 393 阅读 · 0 评论