![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
哆啦A梦~~
这个作者很懒,什么都没留下…
展开
-
深入C++的new
8“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:class A{ int ...转载 2018-04-15 18:00:27 · 129 阅读 · 0 评论 -
位图法介绍
一、定义位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。在STL中有一个bitset容器,其实就是位图法数据结构unsigned int bit[N];在这个数组里面,可以存储 N*sizeof(int)*8个数据,但是最大的数只能是N*sizeof(int)*8-1。...转载 2018-12-15 18:20:26 · 5537 阅读 · 0 评论 -
c++类间的关系
网上关于此类的讨论非常多,发现对于该问题的理解各有各的说法,而各个说法中又相去甚远。通过浏览这些讨论以及对《O'Reilly - UML 2.0 In A Nutshell (2007)》的参考,发表一下自己的看法类间关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。纵向关系就是继承关系,它的概念非常明确,也成为OO的三个重要特征之一,这里不过多的讨论。横向关系较为微妙,按照...转载 2018-12-22 12:49:08 · 334 阅读 · 0 评论 -
struct占多少字节例题
1、字节对齐的细节和编译器实现相关,但一般而言,如在windows下,就VC而言,满足一下三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);即:在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量...转载 2018-12-17 16:32:39 · 2502 阅读 · 0 评论 -
struct与union字节大小的终极解释
1、字节对齐的细节和编译器实现相关,但一般而言,如在windows下,就VC而言,满足一下三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);即:在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏...转载 2018-12-11 14:37:01 · 526 阅读 · 0 评论 -
C++类的大小——sizeof(class)
1. 空类class A{}; void main(){ printf("sizeof(A): %d\n", sizeof(A)); getchar();} 得到结果为:1。 类的实例化就是给每个实例在内存中分配一块地址。空类被实例化时,会由编译器隐含的添加一个字节。所以空类的size为1。先了解一个概念:类的实例化,所谓类的实例化就是在内存中分配一块地址,每...转载 2018-12-26 11:05:11 · 341 阅读 · 0 评论 -
虚函数和纯虚函数的区别
纯虚函数没有函数体,有纯虚函数的类为抽象类,不可以实例化对象,需要派生类来实现。虚函数只在派生类中有同名函数时才会被隐藏原创 2019-01-17 16:14:12 · 169 阅读 · 0 评论 -
C/C++ 排序函数 qsort(),sort()的用法
C库函数qsort,C++库函数sort。其中qsort相对较慢,sort实现非常高效qsort:功 能: 使用快速排序例程进行排序头文件:#include<qsort>用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void...转载 2019-01-17 19:48:28 · 3223 阅读 · 0 评论 -
字符串反转的3种方法
1.自己编写#include <iostream>using namespace std; void Reverse(char *s,int n){ for(int i=0,j=n-1;i<j;i++,j--){ char c=s[i]; s[i]=s[j]; s[j]=c; }} int main...原创 2019-01-23 20:03:23 · 1206 阅读 · 0 评论 -
C 标准库 - string.h
简介string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。库变量下面是头文件 string.h 中定义的变量类型:序号 变量 & 描述 1 size_t 这是无符号整数类型,它是 sizeof 关键字的结果。 库宏下面是头文件 string.h 中定义的宏:序号 宏 & 描述 1 NULL...转载 2019-01-23 20:45:20 · 176 阅读 · 0 评论 -
C 输入 & 输出 -C++ 基本的输入输出
当我们提到输入时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。标准文件C 语言把所有的设备都当作文件。所以设备(比如显示器)被处...转载 2019-01-23 21:10:08 · 804 阅读 · 0 评论 -
fgets(buf,sizeof(s),stdin) ,getline(cin,str)
1、fgets(buf, n, file) 函数功能:从 目标文件流 file 中读取 n-1 个字符,放入以 buf 起始地址的内存空间中。楼主的函数调用是这个意思:首先,s 肯定是一个字符数组。该调用从 标准输入流 stdin (也就是键盘输入)读入 s 数组的大小(sizeof(s))再减 1 的长度的字符到 buf 所指的内存空间中(前提是buf已经申请好空间了)2、int...原创 2019-01-10 11:46:42 · 5122 阅读 · 1 评论 -
C++中的位拷贝和值拷贝
为了便于说明我们以String类为例:首先定义String类,而并不实现其成员函数。ClassString{public:String(constchar*ch=NULL);//默认构造函数String(constString&str);//拷贝构造函数~String(void);String&operator=(constString&str);//赋值函数p...转载 2019-02-21 19:48:20 · 796 阅读 · 0 评论 -
freopen("in.txt","r",stdin) 函数的用法
在做acm题目的过程中,我们需要在本地机器上调试。调试过程中,如果输入数据少还可以接受,但如果输入数据很庞大的话,我们就很难忍受一次又一次的重新输入和调试了。通过google,找到一种简便的方法,那就是freopen函数。 使用freopen函数可以解决测试数据输入问题,避免重复输入,不失为一种简单而有效的解决方法。下面为函数的简介,详细可参见http://www.cplusp...转载 2019-03-27 09:05:10 · 4779 阅读 · 3 评论 -
如何解决VC编译inet_addr出现error C4996的问题
在编译过程中出现如图所示error C4996的错误,此问题在vc2013及以上版本都会出现,主要是编译器进行了安全检查,部分旧的函数限制使用。解决此问题有两种方法。方法/步骤 第一种方法是去掉SDL检查。设置项目属性,将c/c++->SDL检查设置为“否”即可跳过检查,使用旧的函数可编译成功。 std::string addr; ........ ...转载 2019-04-07 10:07:08 · 1242 阅读 · 0 评论 -
c++ vectorb(a[0].size(),vector(a.size()))
vector<vector<int>>b实例化一个名为b的vector。这个vector当中存得是一系列的vector<int>。实例化的同时,在b里面放入一些默认值。总共放入a[0].size()个默认值,默认值的内容是vector<int>(a.size()),即一个长度为a.size(),里面值都填充为0的vector<int>...转载 2018-12-09 11:14:53 · 1345 阅读 · 0 评论 -
C++ 定义数组 传递数组
1、静态内存分配:在定义数组(必须指定数组的大小为一个常量或者常数),例如:int array[10];//或const int Size=10;int array[Size];2、动态内存分配:一维数组:c语言: //定义int arraysize;//元素个数printf("请输入数组的大小:");scanf("%d",&arraysize);...原创 2018-12-08 19:50:40 · 1661 阅读 · 0 评论 -
VS2013控制台程序运行一闪而过的最佳解决办法
当我们写完一个小程序,F5或者ctrl+F5运行时想看看运行结果,控制窗口有时会一闪而过,这样就看不到运行的结果,怎么办呢? 有些人会给程序最后加一句 system("pause"); 但是我发现加上这条语句虽然可以让窗口在最后停下来,但是在c++程序里不能打印出最后析构函数里想输出的内容。所以推荐使用下面的方法,配置一下编译器设置。配置方法:项目——>属性——&g...转载 2018-07-05 15:51:12 · 801 阅读 · 0 评论 -
typedef int (*funp_t)(int) 和typedef int fun_t(int)的比较
相似点都使用typedef将由基础数据类型构成的复杂组合类型赋给一个简单的名字;都遵循C的传统——由typedef定义的类型以“_t“结尾;二者都能起到减少代码字符输入量的作用;“一定程度上”增加代码的可读性(此观点不具有绝对正确性,仁者见仁)在以下情况调用函数使用方式相同:void second(fun_t first);void second(fun_t *first);void seco...转载 2018-04-15 20:19:16 · 770 阅读 · 1 评论 -
C结构体之位域(位段)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位...转载 2018-04-12 22:04:50 · 121 阅读 · 0 评论 -
C++ 按位与、或、异或等运算方法
按位与运算符(&)参加运算的两个数据,按二进制位进行“与”运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:两位同时为“1”,结果才为“1”,否则为0例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。 另,负数按补码...转载 2018-04-15 21:18:50 · 445 阅读 · 1 评论 -
C++自己编写吐出异常时,throw与throw new的区别
一直都是照着别人的指示在代码中加入异常的检查,但是从来没有在代码中处理过异常。今天下午把一段代码写到VS里,代码会对非法输入吐出异常,然后main函数里会捕捉到这些异常。吐出异常的代码:[cpp] view plain copyif (numbers == NULL || length <= 0) throw new std::exception("Invalid P...转载 2018-04-14 11:12:39 · 4811 阅读 · 0 评论 -
标准异常
C++标准库定义了一组类,用于报告在标准库中的函数遇到的问题。程序员可在自己编写的程序中使用这些标准异常类。标准库异常类定义在四个头文件中:(1)<exception>头文件定义了最常见的异常类,它的类名是exception。这个类只通知异常的产生,但不会提供更多的信息。(2)<stdexcept>头文件定义了几种常见的异常类。这些类型在表1中列出。(3)&l...转载 2018-04-14 11:14:41 · 204 阅读 · 0 评论 -
C++中构造函数,拷贝构造函数和赋值函数的区别和实现
目录构造函数拷贝构造函数赋值函数C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现1.构造函数构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同)首先说一下一个C++的空类,编译器会加入哪些默认的成员函数·默认构造函数和拷贝构造函数...转载 2018-04-20 15:55:07 · 201 阅读 · 0 评论 -
1_赋值运算符函数
面试题1:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public:CMyString(char *pData=NULL);//构造函数CMyString(const CMyString& str);//拷贝构造函数~CMyString();//析构函数private:char* m_pData;//数据域,字符指针};介绍重载赋值 ...原创 2018-04-20 16:30:00 · 189 阅读 · 0 评论 -
剑指offer 面试题2 Singleton模式 C++实现
1、题目来源《剑指offer 名企面试官精讲典型编程题 纪念版-何海涛 著》2、C++设计模式——单例模式: http://www.jellythink.com/archives/823、C++11多线程教程:http://billhoo.blog.51cto.com/2337751/1294190题目:实现Singleton模式 以下内容是我在看《剑指offer》的面试题2时,遇到的问题,因为...转载 2018-04-20 19:08:30 · 387 阅读 · 0 评论 -
在C语言中,double、long、unsigned、int、char类型数据所占字节数
和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<=sizeof(int) 2 sizeof(int)<=sizeof(long int) 3 short int至少应为16位(2字节) 4 long int至少应为32位。 ...转载 2018-04-27 15:16:25 · 10981 阅读 · 0 评论 -
如何理解const char*, char const*, char*const等
1.实际上只分const在*左,还是const在*右 const在*左,则p可变,*p反之;const在*右,则p是const,*p反之 详细的说:const修饰时即可放在被修饰对象前也可放在被修饰对象后。所以关键看哪个对象离const近。 const char *p 明显可以看出const离char 近,故修饰的是char 所以定义的是一个指向const char 的指...原创 2018-06-06 14:12:05 · 917 阅读 · 0 评论 -
C++多态相关整理
一、C++多态的实现原理 多态性是一个接口多种实现,是面向对象的核心。分为静态多态和动态多态。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。1)静态多态 静态多态是通过重载和模板技术实现,在编译的时候确定。函数重载技术利用参数的不同确定调用关系,函数模版技术利用类型的不同生成不同的执行...转载 2018-06-14 15:00:59 · 236 阅读 · 0 评论 -
C++11中智能指针的原理、使用、实现
目录理解智能指针的原理智能指针的使用智能指针的设计和实现1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更...转载 2018-06-17 08:25:44 · 140 阅读 · 0 评论 -
new和malloc的区别 整理
0 属性 new/delete是C++关键字(操作符),需要编译器支持。malloc/free是库函数,需要头文件支持。1 参数 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据数据类型信息自行计算,如’int * a = new。而malloc则需要显式地指出所需内存的尺寸,如’int * a = malloc(sizeof(int))’;。2 返回类型...原创 2018-06-11 10:22:00 · 124 阅读 · 0 评论 -
C++程序的内存格局通常分为哪几个区
一、五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放...转载 2018-06-19 09:49:31 · 3745 阅读 · 0 评论 -
int main(int argc,char *argv[])中argc,argv[]分别表示啥
argc是主程序参数个数,也就是出入参数的个数,这个数一开始是不确定的,要根据自己输入了多少参数而确定;argv[]数组存入的是传入参数的个数。从argv[0]开始,argv[0]存放的是可指向文件的文件名,然后argv[1].。。。依次存放后面传入的参数。...原创 2019-04-12 15:59:20 · 1472 阅读 · 0 评论