
C/C++
文章平均质量分 62
长着胡萝卜须的栗子
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
如何确定一个数二进制中一的个数
这里介绍三个方法: 第一种方法: 因为已经确认了给的数是一个整数,即四个字节,32个bit位。那我们可以设置两个计数器,我们每循环一次,让值右移一位,并且按位与1,即: num 5 0…0 (24个0)0000 0101 第1次: 0000 0101 & 0000 0001 = 0000 0001 第二次:原创 2016-03-30 00:29:15 · 1319 阅读 · 0 评论 -
malloc,calloc,realloc函数用法,原理及不同解析
一、malloc malloc在MSDN中原型为: void *malloc( size_t size ); 介绍为: malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a原创 2016-03-14 15:50:31 · 3742 阅读 · 0 评论 -
【工具】GDB使用方法总结(已重新排版)
GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。而Windows下的图转载 2016-08-08 22:31:53 · 3346 阅读 · 2 评论 -
【工具】GDB常见调试命令
1 、基本命令1.1 启动和退出GDB[root@localhost ~]#gdb test 启动GDB调试test程序[root@localhost ~]#gdb programe 2146 启动GDB调试进程号为2146的进程[root@localhost ~]# gdb (gdb) attach 2146 启动GDB挂载到进程号为2146的进程上开始调试(gdb)detach 2转载 2016-08-08 22:36:43 · 2167 阅读 · 0 评论 -
【工具】gdb多线程/多进程(守护进程)调试
一 调试多进程1) follow-fork-mode :set follow-fork-mode [parent|child]parent: fork之后继续调试父进程,子进程不受影响。 child: fork之后调试子进程,父进程不受影响。在使用如下方法设置完要调试的程序后:gdb命令行的 –-args 参数 gdb环境中 set args命令。 gdb –pid=PID(ps -ef |转载 2016-08-08 22:53:52 · 2654 阅读 · 0 评论 -
C语言与C++中static,extern的用法及区别总结
在C语言中:隐藏 很多人经常会忘了这一条。其实这个作用很常用也很重要。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 char a = 'A'; // global variablevoid msg() { printf("Hello\n原创 2016-08-10 22:31:21 · 4600 阅读 · 0 评论 -
C++继承详解之二——派生类成员函数详解(函数隐藏、构造函数与兼容覆盖规则)
在这一篇文章开始之前,我先解决一个问题。在上一篇C++继承详解之一——初探继承中,我提到了在派生类中可以定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数。在谭浩强的C++程序设计这本书第十一章,351页最下面有这么一段话: 可在派生类中声明一个与基类成员同名的成员函数,则派生类中的新函数会覆盖基类的同名成员,但应注意:如果是成员函数,不仅应是函数名相同,而且函数的参原创 2016-04-11 13:54:45 · 12445 阅读 · 0 评论 -
c++继承详解之一——继承的三种方式、派生类的对象模型
C++是OOP(Object Oriented Programming)语言,即面向对象编程语言。OOP的核心思想就是数据抽象(类的设计),继承和动态绑定。类展现了C++的封装特性,即将具体的实现过程隐藏,只向外暴露公有接口,即数据抽象,通过数据抽象,我们可以将类的接口与实现分离,(即设计类)。与C相比,类可以通过相互间的继承和派生形成层次结构,派生类继承了基类的数据结构和方法 [编译时]。使原创 2016-04-11 01:00:00 · 36407 阅读 · 0 评论 -
C++继承详解之三——菱形继承+虚继承内存对象模型详解vbptr(1)
在我个人学习继承的过程中,在网上查阅了许多资料,这些资料中有关菱形继承的知识都是加了虚函数的,也就是涉及了多态的问题,而我在那个时候并没有学习到多态这一块,所以看很多资料都是云里雾里的,那么这篇文章我想以我自己学习过程中的经验,由简到较难的先分析以下菱形继承,让初学者先对这个问题有一点概念,在后面会由浅入深的继续剖析。 本篇文章不会涉及到多态也就是虚函数的菱形继承,在后面的文章更新中,我原创 2016-04-12 14:47:01 · 9339 阅读 · 9 评论 -
C++继承详解之四——is-a接口继承和has-a实现继承
在学习继承的过程中,不管是在书中还是在网上找资料,都跟多态分不开,其中还有个很抓人眼球的问题,那就是书上总是说的is-a关系和has-a关系。 很多书中讲到继承时都会说: public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用,因为每个子类对象也都是一个父类对象。 protetced/private继承是一个实现继承,基类的部分成员并非完全成为原创 2016-04-12 20:33:11 · 5933 阅读 · 1 评论 -
C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable
前面我写了几篇关于继承的博文,分别为: c++继承详解之一——继承的三种方式、派生类的对象模型 C++继承详解之二——派生类成员函数详解(函数隐藏、构造函数与兼容覆盖规则) C++继承详解之三——菱形继承+虚继承内存对象模型详解vbptr(1) C++继承详解之四——is-a接口继承和has-a实现继承 这几篇博文只涉及到了继承的知识,没有加入虚函数没有涉及到多态的知识,从这篇开始我会更原创 2016-04-13 15:13:24 · 8239 阅读 · 5 评论 -
C++多态篇2——虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏
上一篇C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable中,我在最后分析了虚函数与虚函数表的内存布局,在下一篇详细剖析虚函数及虚函数表的过程中,我发现有关函数重载,函数覆盖,函数重写和函数协变的知识也要理解清楚才能对虚函数表在内存中的布局,对派生类的对象模型以及对多态的实现有更深的理解。 所以这一篇我作为一篇过渡篇,也同时对我以前写过的一篇博文进行一个收尾。在C++继承详解原创 2016-04-15 01:23:17 · 7566 阅读 · 2 评论 -
C++多态篇3——虚函数表详解之多继承、虚函数表的打印
在上上一篇C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable中,我最后简单了剖析了一下虚函数表以及vptr。 而在上一篇文章C++多态篇2——虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏中我详细介绍了虚函数的函数重载,函数覆盖以及函数隐藏的问题,其实在那一篇文章中,对单继承的虚函数已经做了十分详细的解答了,如果对前面有兴趣的人可以先看一下那篇文章。 在这一篇中,我原创 2016-04-15 15:49:05 · 8506 阅读 · 4 评论 -
boost库智能指针,循环引用,定置删除器详解
智能指针用于指向存放在堆,即动态分配对象指针的类,用于对指针所指向的对象生存期的控制,防止内存泄露。 boost库中的智能指针定义在namespace boost中,包括: shared_ptr weak_ptr scoped_ptr shared_arr scoped_arrauto_ptr auto_ ptr是在std库中的,不在boost库中,但是auto原创 2016-09-16 00:16:35 · 1721 阅读 · 0 评论 -
C++泛型编程1——函数模板实例化,模板参数,重载及特化
在C++中我们都知道引入了函数重载,那么在实际应用过程中: 如果我们想要实现一个加法函数,我们可以写出很简单的代码: int ADD(int a,int b){ return a+b;} 上面的函数很简单,但是仔细想一下,这样就实现了加法操作嘛?当我们的实参类型为double,float时,又怎么处理加法呢? 我们可以多定义几个函数 double ADD(doubl原创 2016-08-13 02:09:37 · 6526 阅读 · 0 评论 -
C++泛型编程2——类模板,容器适配器,仿函数
模板编译 当编译器遇到一个模板定义时,它并不生成代码。只有当我们实例化出模板的一个特定版本时,编译器才会生成代码。当我们使用模板时,比编译器才生成代码。 这一特性影响了我们如何组织代码以及错误何时被检测到。 通常,当我们调用一个函数时,编译器只需要掌握函数的声明。 类似的,当我们使用一个类类型的对象时,类定义必须是可用的,但成员函数的定义不必已经出现。 因此我们将类定义和函数声原创 2016-08-13 22:46:06 · 2184 阅读 · 0 评论 -
【排序】快速排序及其非递归实现,归并排序详解
快速排序 快速排序(Quicksort)是对冒泡排序的一种改进。 我们知道快速排序用的是分治的基本思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归的解决这些子问题,然后将这些子问题的解组合为原问题的解。 快速排序的基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行原创 2016-08-08 19:32:09 · 1959 阅读 · 0 评论 -
【排序】插入排序,希尔排序,选择排序,冒泡排序,堆排序详解及稳定性分析
插入排序直接插入排序 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。 在这里要注意直接插入排序的前提,是插入到一个已经排好序的有序序列中,这表明,我们在插入一个数之前,必须保证被插入的序列是有序序列。 所以我们在插入之前,要先构造一个有序序列, 所以从第一个参数开始,我原创 2016-08-05 13:00:23 · 2706 阅读 · 1 评论 -
Fedora23下安装QT5.5.1之路
因为个人需要,刚开始用的是Centos6.5,老师看到系统内核版本直接让换了Fedora23,安装Fedora23的过程也是很艰辛的。。在这里就不赘述,下次有时间再写一个安装Fedora的博客。在Centos下因为内核版本低,自带的gcc版本也低,但因为项目需要QT5.5版本,所以我在Centos下进行的第一件事是升级gcc,当然这个过程也是很艰辛的。。。最后因为升级的太麻烦果断换系统~跑题了这么原创 2016-03-14 00:43:39 · 4838 阅读 · 0 评论 -
C++中引用详解
C++中引入了引用这个复合类型,上一篇我写了关于引用和指针的区别,在这篇中我总结一个有关引用的需要注意的地方。 1.引用不会产生新的变量,而是给变量起了一个别名 编译器不会给引用变量开辟新的空间,如果对引用传值的语句进行反汇编查看,可以看出,编译器在底层进行引用处理的时候,跟指针处理是一样的,即引用变量与引用变量绑定的变量的地址相同。 2.引用变量不是一个对象原创 2016-03-27 14:10:55 · 1210 阅读 · 0 评论 -
指针和引用的区别
C++中有几种复合类型,这里介绍引用和指针的区别 引用其实就是变量的别名,并且引用底层就用指针实现的,只不过引用跟初始化的变量已经绑定了,在作用域中不能再改变引用绑定的实体了。现按条列出指针和引用的区别: 1.引用是变量的别名,在定义的时候必须进行初始化,而指针可以先定义,再进行赋值int i,&j = i;int &j; //错误!必须初始化!int *j = &i;int *j;j原创 2016-03-27 13:52:48 · 716 阅读 · 0 评论 -
C++中自增自减运算符疑惑大全
一、有关前置与后置的区别#include <iostream>using namespace std;int main(){ int i = 0,j; cout << "对运算符优先级进行检验" << endl; cout << "i = 0" << endl << "-i++\t=\t" << -i++ << endl; cout << "i\t=\t" <<原创 2016-02-20 12:50:41 · 1074 阅读 · 0 评论 -
不带头结点的单链表操作
typedef int DataType;typedef struct ListNode{ DataType data; struct ListNode *pNext;}SL所有操作:#define _CRT_SECURE_NO_WARININGS 1#include <stdio.h>#include <assert.h>#include <malloc.h>#incl原创 2016-03-15 11:11:14 · 1016 阅读 · 0 评论 -
C++处理字符串的方法——字符串类与字符串变量
一、字符数组 C语言中可以设置一个二维数组,例如str[3][30],大小为3x30,即有3行30列,每一行可以容纳30个字符,可以把str[0],str[1],str[2]看做三个一维字符数组,它们各自有30个元素。 例如:有三个字符串,要求找出其中最大者(要求用函数调用)#include <iostream>#include <string>using namespace原创 2016-02-22 23:38:50 · 1164 阅读 · 0 评论 -
C与C++比较新增功能大全(完善中)
1、输入流与输出流 cin与cout为输入输出流,在C++中作为输入输出函数使用。 与scanf与printf相比,使用更加简洁方便,不需要指定输出内容的格式与数据类型例如%d等 2.内置函数(也叫内联函数) 内置函数在声明及定义时函数名前要加inline作为内置函数的标志 C++中使用内置函数会提高程序的效率,但同时会增加程序的长度,在每次调用内置函数的时原创 2016-02-20 22:16:12 · 1016 阅读 · 0 评论 -
C++中关于指针的理解(一点一点完善中)
一、指针 1. 指针的值是一个地址,通过间接寻址运算符*来区分地址与指针所指地址保存的值区分开。 *实际上是运算符重载(C++中提及) 例如: int *p,i; p = &i; p的值是i的地址,*p的值为i的值。 指针的两个属性:内容和位置。 其中位置可以存储在另一个变量中,这样便成为了原创 2016-02-21 21:58:15 · 1539 阅读 · 0 评论 -
error LNK2001: unresolved external symbol "private: static
一般情况是类中定义了一个静态公共变量 定义完成编译连接。提出上面的错误。解决办法对静态变量进行初始化就行了。下面给出使用静态变量(static)的一些提示 静态数据成员的使用方法和注意事项如下: 1、静态数据成员在定义或说明时前面加关键字static。 2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下: <数据类型><类名>::<静态数据成员名>=<值> 这原创 2016-03-31 20:48:53 · 1264 阅读 · 0 评论 -
共用数据的保护
一、常对象* 类名 const 对象名 [(实参表列)] = const 类名 对象名 [(实参表列)]*如果一个对象被声明为常对象,则不能调用该对象的非const型成员函数,目的是为了防止这些函数会修改常对象中数据成员的值。常成员函数的声明 void get()const;如果一定要修改常对象中的某一个数据成员的值,则应该对该数据成员声明为mutablemutable int count;原创 2016-02-24 22:25:51 · 850 阅读 · 0 评论 -
静态成员
如果想在同类的多个对象之间实现数据共享,可以用静态的数据成员class Box{ public: int volume(); private: static int height; int width; int length;};静态数据成员在内存中只占一份空间,每个对象都可以引用这个静态数据成员。 静态数据成员是在所有对象之外单独原创 2016-02-24 22:36:16 · 744 阅读 · 0 评论 -
C++为什么不叫++C
今天看到朋友圈有一个学姐发了一条:为什么C++不叫++C这个问题,跟我第一条博客中关于自增运算符的讨论有关。在知乎,在博客,在C++ Primer书中进行查看后,自己总结如下:大家都知道C++进行后,表达式的左值的值为C,C再自己进行自加。 而++C进行后,表达式的左值的值为C自加后的值。大体的意思是: C++后,首先得到的是C,在进行+1扩展,体现了C++兼容C的思想。又体现了C+原创 2016-03-11 13:17:14 · 1698 阅读 · 0 评论 -
为什么要用二级指针
在重新回顾C语言数据结构时,在实现顺序表和链表时关于指针使用的区别让我觉得很有趣 像在顺序表中实现struct SeqList{ DataType arry[MAX_SIZE]; int Size;};而我们在使用顺序表时,往往在main函数中直接定义:SeqList seqlist;在后面对顺序表的使用中,直接传参,比如InitList(&seqlist);而在链表中type原创 2016-03-14 00:54:42 · 2609 阅读 · 0 评论 -
关于动态顺序表的所有操作代码
定义如下:#pragma oncetypedef int DataType;#define LIST_SIZE 1#define EMPTY_SIZE 0typedef struct SqListD{ DataType *arry; size_t iSize; size_t iCapacity;}SqListD,*PSeqList;操作代码如下:#define _CR原创 2016-03-15 11:12:52 · 701 阅读 · 0 评论 -
C语言实现顺序表的所有操作代码
头文件如下:#ifndef SEQ_LIST#define SEQ_LIST#include <stdio.h>typedef int DataType;#define MAX_SIZE 10typedef struct SeqList{ DataType arry[MAX_SIZE]; size_t Size;}SeqList, *PSeqList;#endif源原创 2016-03-15 11:14:49 · 3092 阅读 · 0 评论 -
free()后程序崩溃问题
昨天写了一段关于不带头结点的单链表的操作代码,其中只要遇到free()函数,程序就崩溃,cmd.exe一直无法关闭,只有等重启之后才能关闭找了一段时间原因,终于让我找到了,我估计所有出现free后程序崩掉的原因就是这个,内存溢出或者说内存分配出现了问题先上源码:PSListNode BuyNode ( PSListNode *p ){ *p = (PSListNode*)malloc(si原创 2016-03-15 10:48:26 · 6570 阅读 · 0 评论 -
防止头文件重复包含的两种方法及区别
1.条件编译语句#ifndef#define#endif 相信很多人都知道第一种方法。#ifndef _TEST_H_ //——1#define _TEST_H_ //——2//加入各种变量,函数声明#endif //——3以上代码:如果没有定义TEST_H变量,就继续往下执行,如果定义了,就直接endif,即不做任何操作。 如果一个文件中包含原创 2016-03-27 16:21:19 · 10185 阅读 · 1 评论 -
C++值传递时返回临时变量,引用传参
在C++中,引用不会产生新变量,所以在引用做返回值的时候,就不会产生临时变量,上代码:int a = 10;int fun(){ int b = 10,c = 12; a = b + c; return a;}请问上面这段代码,返回值会不会产生临时变量呢? 答案是会的 因为我们的返回值是int型的变量,即在这里如果我们的main函数进行int main(){原创 2016-03-27 10:19:15 · 2354 阅读 · 0 评论 -
引用传值与指针传值
引用传值与指针传值其实没有区别,本质都是传址int* ADD(int A,int B){ int C = A + B; return &c;}int main(){ int a = 1,b = 2; int *c = ADD(a,b); int d = 5; printf("%d",d); printf("%d",*c);}输出结果是原创 2016-03-27 11:35:45 · 701 阅读 · 0 评论 -
设计模式之单例类——如何让一个类只实例化一个对象
这道题的思路是,我只让这个类通过一个公有函数实例化对象,即可以将构造函数设置为私有成员函数。include <iostream>using namespace std;class Single{public: static Single& SingleCreate() { if (m == NULL) { m = new S原创 2016-03-31 22:17:07 · 4283 阅读 · 0 评论