c/c++编程
文章平均质量分 64
丿咫尺天涯
这个作者很懒,什么都没留下…
展开
-
C/C++中static关键字作用总结
C/C++中static关键字作用总结1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global var转载 2015-01-07 23:10:35 · 460 阅读 · 0 评论 -
STL面试
1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等2.标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉转载 2015-05-28 10:38:06 · 764 阅读 · 0 评论 -
访问 www.taobao.com过程
首先是查找浏览器缓存,浏览器会保存一段时间你之前访问过的一些网址的DNS信息,不同浏览器保存的时常不等。如果没有找到对应的记录,这个时候浏览器会尝试调用系统缓存来继续查找这个网址的对应DNS信息。如果还是没找到对应的IP,那么接着会发送一个请求到路由器上,然后路由器在自己的路由器缓存上查找记录,路由器一般也存有DNS信息。如果还是没有,这个请求就会被发送到ISP(注:Int转载 2015-08-27 19:31:14 · 34891 阅读 · 0 评论 -
C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。 堆,就是那些由 new 分配的内存块,他们的释放编译器不去转载 2015-07-21 11:03:47 · 364 阅读 · 0 评论 -
c++ const常量的实现机制
const关键字的基本思想就是将一个变量变成常量,试图从语言设计者的角度去分析引入该关键字的动机。我猜测原因如下:1)提醒程序员,某些值是常量,如PI。或该值在程序运行期间是不变的,防止程序员误修改。对于多模块开发,头文件引用复杂的系统来说,这是很重要的,如果不能在编译期阻止常量被误修改,那么这些修改将引起运行时调试困难的问题。2)改进c语言中的#define预处理宏,1)中提转载 2015-08-27 17:00:10 · 410 阅读 · 0 评论 -
内联函数和宏定义的区别
用内联取代宏:1.内联函数在运行时可调试,而宏定义不可以;2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,宏定义则不能; 4.在类中声明同时定义的成员函数,自动转化为内联函数。文章(一)内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如:原创 2015-08-28 16:08:55 · 478 阅读 · 0 评论 -
跳表(Skip List)的介绍以及查找插入删除等操作
今天有同学去面试,被问到了“跳表”这种数据结构,说实话我之前对它了解不多,于是上网查了跳表的资料,并在这里总结一下。什么是跳表?要说清楚这个问题,我们就要先从普通的有序链表说起。一个普通有序列表的结构如下:我们可以看到,上图所示的链表按照由小到大的顺序排列(-1表示最小值,1表示最大值,这是本文的一个约定),如果我们想要查找一个元素x,算法如下:转载 2015-08-29 09:23:18 · 2668 阅读 · 1 评论 -
如何实现一个malloc
如何实现一个malloc任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操转载 2015-08-14 16:32:45 · 371 阅读 · 0 评论 -
运算符重载函数作为类成员函数和友元函数
可以看到,重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this->real+c2.real,this->real就是c1.real。上节中已说明,在将运算符函数重载为成员函数后,如果出现含该运算符的表达式,如c1+c2,编译系统把它解释为 c1.operator+(c2)即通过对象c1调用运算符重载函数,并以表达转载 2015-08-30 17:08:46 · 1373 阅读 · 0 评论 -
c++中的隐藏、重载、覆盖(重写)
c++中的隐藏、重载、覆盖(重写) 1 重载与覆盖 成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。 覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。转载 2015-08-30 17:50:20 · 364 阅读 · 0 评论 -
再谈typedef
示例:下列用法错误的是:typedef INT int;typedef unsigned char byte;typedef char str40[41];typedef long float double答案:AD 用法说明:1、 为现有数据类型定义同义词 typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。例如:typ转载 2015-08-30 17:20:35 · 393 阅读 · 0 评论 -
malloc/free与new/delete的区别
相同点:都可用于申请动态内存和释放内存不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内转载 2015-08-11 22:03:57 · 284 阅读 · 0 评论 -
浅析 RTTI机制
RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息。它提供了运行时确定对象类型的方法。本文将简略介绍 RTTI 的一些背景知识、描述 RTTI的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI;本文还将详细描述两个重要的 RTTI运算符的使用方法,它们是 typeid和 dynamic_cast。 其实原创 2015-08-25 19:41:27 · 607 阅读 · 0 评论 -
c++命名规范
这个编程规范是我们自己做项目时,根据google c++编程规范改写的,适合小型项目使用,给大家分享一下。头文件 通常,每一个.cc文件(C++的源文件)都有一个对应的.h文件(头文件),也有一些例外,如单元测试代码和只包含main()的.cc文件。 1. #define保护 所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命转载 2015-07-15 21:35:05 · 569 阅读 · 0 评论 -
using namespace std详解
C++ using namespace std 详解在新的C++标准中,生成新头文件的方法仅仅是将现有C++头文件名中的.h去掉。例如,变成了,变成了,等等。对于C头文件,采用同样的方法,但在每个名字前还要添加一个c。所以C的变成了,变成了,等等。旧的C++头文件是官方所反对使用的(即,明确列出不再支持),但旧的C头文件则没有(以保持对C的兼容性)。下面是C++头文件的现状转载 2014-11-27 00:00:53 · 3215 阅读 · 0 评论 -
《你必须知道的495个C语言问题》笔记--自己的
1.void main()正确吗?很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /*... */ } is not and never has been原创 2015-01-14 14:46:23 · 869 阅读 · 0 评论 -
构造函数的顺序
要想搞明白该问题,需要理解基类构造析构函数、子类构造析构函数和子类成员变量构造析构函数的调用顺序。对于构造函数:基类构造函数 > 子类成员变量构造函数 > 子类构造函数对于析构函数:子类析构函数 > 子类成员变量析构函数 > 基类析构函数可以看出构造函数的调用过程和析构函数的调用过程正好相反。main函数中首先构造变量a,然后是b。在构造b时首先调用b的基类A的构造函数原创 2015-08-22 21:39:45 · 1244 阅读 · 0 评论 -
c++三种野指针
野指针,也就是指向不可用内存区域的指针。如果对野指针进行操作,将会使程序发生不可预知的错误,甚至可能直接引起崩溃。 野指针不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是野指针是很危险的,也具有很强的掩蔽性,if语句对它不起作用。 造成野指针的常见原因有三种: 1、指针变量没有被初始化。任何转载 2015-07-15 18:49:52 · 9478 阅读 · 0 评论 -
new 对象加括号和不加括号的区别
在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:[cpp] view plaincopyprint?CBase *base = new CDerived(); CBase *base = new CDeviced; CBase *base = new CDerived();CBase *base = new C转载 2015-07-16 10:40:11 · 6400 阅读 · 1 评论 -
函数调用方式stdcall、cdecl
最大的区别就是__cdecl是由调用函数者释放堆栈,而__stdcall由被调用者释放。但是我们在调用任一种函数时,都没有进行显示的释放堆栈工作。这个工作由编译器完成,它帮我们生成了这个中间要使用的代码。 以下系转载: 在C语言中,假设我们有这样的一个函数: int function(int a,int b) 调用时只要用r转载 2015-05-15 00:05:26 · 479 阅读 · 0 评论 -
c++中内存分配方式
内存的三种分配方式:1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指转载 2015-05-15 19:17:02 · 378 阅读 · 0 评论 -
volatile的作用
一、volatile的作用 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。volatile int i=10; int j = i; ... i转载 2015-08-11 10:19:00 · 315 阅读 · 0 评论 -
c++------virtual const static
一、成员变量const int a;必须赋值或者在类的构造函数参数初始化列表中,两者只能取其一。 static int a;不能在类中进行赋值,也不能在参数初始化列表中进行赋值。对于静态变量,在类中只是声明,当在类外进行初始化时,必须先定义,即需要加上int .即 int base::a=10; 二、成员函数void fun()const{}cons原创 2015-07-17 20:32:16 · 1051 阅读 · 0 评论 -
c/c++----------虚函数、虚继承、纯虚函数
一、虚函数是为了实现多态性:允许使用统一的接口去访问不同子类的函数。[cpp] view plaincopyprint?class A { public: A(){} virtual void print() { cout"I am A" } };原创 2015-08-03 19:20:15 · 596 阅读 · 0 评论 -
堆排序 感觉忘了实现一遍
void heapAdjust(int a[],int s,int n){int largest=s;if(2*sa[s])largest=2*s;if(2*s+1a[largest])largest=2*s+1;if(largest==s) return ;else {swap(a[s],a[largest]);heapAdjust(a,largest,n);原创 2015-08-31 16:21:18 · 296 阅读 · 0 评论 -
C++的深拷贝与浅拷贝
C++的深拷贝与浅拷贝对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 123456789101112转载 2015-08-19 10:40:27 · 306 阅读 · 0 评论 -
extern "C"的用法解析
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方转载 2015-09-04 11:00:52 · 242 阅读 · 0 评论 -
Dijstra算法 C++实现
Dijstra算法思想,简化版实现,:从源节点开始调整,相邻节点的最短距离。调整完之后,从距离最短并且没有作为u的节点中选取下一个节点 ,调整后面的节点,时间复杂度O(V*(V+E))。#include#define M 1000using namespace std;int map[5][5]={{0,10,M,5,M},{M,0,1,2,M},{M,M,0,M,6},{M,3原创 2015-09-09 16:23:10 · 2001 阅读 · 0 评论 -
字节存储排序:大端和小端的判别及转换
当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和小端(little- endian)两个描述。字节排序按分为大端和小端,概念如下大端(big endian):低地址存放高有效字节小端(little endian):低字节存放原创 2015-07-30 15:25:45 · 656 阅读 · 0 评论 -
Floyd-Warshall 算法 C++实现
Floyd算法思想:动态规划的方法,总共循环O(V3),动态规划的时间,从节点I到节点j的路径,可能经过{1,2,3,4,5,k},分为两种一种是经过k点的最小值,一种是不经过k点的最小值。#include#define M 1000#define N 5using namespace std;int map[5][5]={{0,3,8,M,-4},{M,0,M,1,7},{原创 2015-09-09 16:33:46 · 1029 阅读 · 0 评论 -
自定义String类
自己定义string类,需要注意的几点:默认构造函数的编写,m_data[0]=‘\0’,拷贝构造函数的引用参数,防止无线递归调用;拷贝构函数:四种情况string a=b;string a(b);void ss(stirng a)string sss()#include#includeusing namespace std;class MyString原创 2015-09-11 11:15:26 · 403 阅读 · 0 评论 -
C++空类编译器自动生成的6个成员函数
c++目录(?)[+]一问题二详解空类声明时编译器不会生成任何成员函数空类定义时会生成6个成员函数三总结一、问题 在C++中,编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢? 二、详解1、空类,声明时编译器不会生成任何成员函数 对于空类,编译器不会生成任何的成员函数,只会生成转载 2015-09-08 17:07:21 · 525 阅读 · 0 评论 -
Unix环境高级编程(阅读笔记)----setjmp和longjmp函数使用详解
非局部跳转语句---setjmp和longjmp函数。非局部指的是,这不是由普通C语言goto,语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。#include Int setjmp(jmp_buf env); 返回值:若直接调用则返回0,若从longjmp调用返回则返回非0值Void longjmp(jmp_buf env,in转载 2016-05-12 21:35:07 · 384 阅读 · 0 评论 -
关键字 restrict
c99中新增加了一个类型定义,就是restrict。看了下网上的相关贴子,但还是问题解决的不够。下面是相关一个文章,我将在后面再加相关说明:那么restrict的意义是什么呢?概括的说,关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好转载 2016-05-04 09:59:19 · 476 阅读 · 0 评论 -
C中不能省略形参名字
一、C与C++的细微区别在函数声明中:无论是C还是在C++,都可以省略形式参数名。但是,通常都不建议省略形式参数名。在函数定义中:1. 当需要使用形式参数的时候,显然,必须给形式参数命名。2. 当不需要使用形式参数的时候,C与C++有微小差异:—— C不能省略形式参数名, 即使不使用。—— C++可以省略形式参数名,如果不使用。—— 并且在C++中,转载 2016-05-04 10:41:29 · 6712 阅读 · 0 评论 -
C/C++之sizeof与strlen的区别
strlen:是C标准库中的字符串函数,用于统计字符的个数。函数原型int strlen(const char * src);循环扫描字符数组的元素,如果不为“/0”则加1,当当前的字符是“/0”时,则退出循环返回长度。当我们要拷贝一个字符串时,一般获取字符的长度加1后,再调用malloc函数。sizeof:是c语言中的运算符,确切的说是一个编译时运算符,用于统计类型或者变量所占的内存字原创 2015-08-19 11:17:22 · 347 阅读 · 0 评论 -
i++是否原子操作?并解释为什么?
不是原子操作。理由:1.i++分为三个阶段:内存到寄存器寄存器自增写回内存这三个阶段中间都可以被中断分离开. 2.++i首先要看编译器是怎么编译的,某些编译器比如VC在非优化版本中会编译为以下汇编代码:__asm{ moveax, dword ptr[i] inc eax mov dwordptr[转载 2015-09-03 09:28:52 · 3170 阅读 · 0 评论 -
malloc(0)的返回值
最近,看了有关malloc(0)的返回值以及其他一些问题的讨论,我把自己的感受和看法记录如下:问题:char* ptr = malloc(0*sizeof(char));if(NULL == ptr) printf("got a NULL pointer");else printf("got a Valid pointer");请问转载 2015-08-31 10:33:38 · 2441 阅读 · 0 评论 -
内存 地址 分配
内存 地址 分配高地址到低地址进行分配的: --------------------------------------------------------------------------------int i=1;int j=1;cout----------------------------------------------------------转载 2015-08-31 14:59:37 · 415 阅读 · 0 评论 -
快排 忘了写一遍
#include #include #include using namespace std;int partion(int s[], int l, int r) //返回调整后基准数的位置 { int i = l, j = r; int x = s[l]; //s[l]即s[i]就是第一个坑 while (i原创 2015-08-31 17:03:37 · 332 阅读 · 0 评论