![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 59
青春兵荒马乱-
这个作者很懒,什么都没留下…
展开
-
c++引用详解
一谈引用引用(reference)是c++对c语言的重要扩充。 一、引用的概念 引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。 例如: Point pt1(10,10); Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。 需要特别强调的是引用并不产生对象的转载 2013-11-30 16:23:09 · 537 阅读 · 0 评论 -
C/C++堆栈指引
言 我们经常会讨论这样的问题:什么时候数据存储在堆栈(Stack)中,什么时候数据存储在堆(Heap)中。我们知道,局部变量是存储在堆栈中的;debug时,查看堆栈可以知道函数的调用顺序;函数调用时传递参数,事实上是把参数压入堆栈,听起来,堆栈象一个大杂烩。那么,堆栈(Stack)到底是如何工作的呢? 本文将详解C/C++堆栈的工作机制。阅读时请注意以下几点: 1)本文转载 2013-12-13 17:58:15 · 371 阅读 · 0 评论 -
C++类对象内存模型与成员函数调用分析(中)
2.4 虚拟成员函数这是本文中最复杂也最有趣的话题了。虚拟函数也是和继承这个话题相伴相生,所以本节将纳入对单继承、多重继承和虚拟继承,一起描述他们之间的关系,这样,对C++对虚拟函数的调用,以及由此所变现出来的多态的理解,应该是非常清晰了。2.4.1 单继承下的虚拟成员函数对于虚拟函数,我们首先引入两个数据结构,为什么引入一会就知道了。1转载 2013-12-13 18:01:03 · 398 阅读 · 0 评论 -
复制构造函数(拷贝构造函数)
也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生。对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么用,其实复制构造函数能解决一些我们常常会忽略的问题。 为了说明复制构造函数作用,我先说说我们在编程时会遇到的一些问题。对于C++中的函数,我们应该很熟悉了,因为平常经常使用;对于转载 2013-12-06 19:58:13 · 331 阅读 · 0 评论 -
C++对象的内存分析(3)
前言 在第二节我们讲到从带虚函数的基类继承的子类,有一个虚函数指针在对象的最前端。但是,如果基类没有虚函数而子类有呢?阅读本节请思考下面的问题:没有虚函数的基类,会有虚函数指针和虚函数表吗?从该类继承的子类,内存中的元素如何布局。 Subject3:从不带虚函数的基类继承的子类 我们把上一节的CBasic类的2个虚函数删除,CFinal从CBasic类继承并增加新的虚函转载 2013-12-13 17:54:50 · 361 阅读 · 0 评论 -
C++类对象内存模型与成员函数调用分析(下)
2.4.2 多重继承下的虚拟函数多重继承下的虚拟函数主要有一下几个麻烦:1. 几个父类都声明了相同原型的virtual函数;2. 有不止一个父类将其析构函数声明为虚拟;3. 一般的虚拟函数问题;先给出代码段9。class Parent1{public: Parent1() : data_parent1(0.0)转载 2013-12-13 18:01:31 · 342 阅读 · 0 评论 -
堆和栈的区别(转过无数次的文章)
一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。转载 2013-12-13 17:46:52 · 303 阅读 · 0 评论 -
C++对象的内存分析(5)
前言 前面4节我们已经完成了对4种C++对象布局的分析,本文试图覆盖更多的,常见的C++面向对象的概念。所以,最后2节将继续阐述2个主题:接口和抽象类以及构造函数、虚构函数和虚析构函数。 接口 这里我准备只主要阐述接口,而不谈一般的抽象类。因为在C++中,是没有“接口”这种类型的,所有的接口事实上是定义为纯抽象类。所谓纯抽象类,就是没有成员变量,没有实现了的函数转载 2013-12-13 17:56:16 · 326 阅读 · 0 评论 -
C++类对象内存模型与成员函数调用分析(上)
C++类对象内存模型是一个比较抓狂的问题,主要是C++特性太多了,所以必须建立一个清晰的分析层次。一般而言,讲到C++对象,都比较容易反应到以下这个图表: 这篇文章,就以这个表格作为分析和行文的策略的纵向指导;横向上,兼以考虑无继承、单继承、多重继承及虚拟继承四方面情况,这样一来,思维层次应该算是比较清晰了。1、C++类数据成员的内存模型1.1 无继承情况实验最能说明转载 2013-12-13 18:00:28 · 523 阅读 · 0 评论 -
关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT、L
char :单字节变量类型,最多表示256个字符,wchar_t :宽字节变量类型,用于表示Unicode字符,它实际定义在里:typedef unsigned short wchar_t。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,定义宽字节类型方法如下: wchar_t c = `A' ; wchar_t * p = L"Hello转载 2014-03-02 21:59:23 · 334 阅读 · 0 评论 -
C++ 对象的内存布局(上)
陈皓http://blog.csdn.net/haoel 前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是为了图一些表达转载 2014-03-06 21:15:36 · 389 阅读 · 0 评论 -
C++ 虚函数表解析
陈皓http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是转载 2014-03-06 21:09:43 · 399 阅读 · 0 评论 -
C++ 对象的内存布局(下)
C++ 对象的内存布局(下) 陈皓http://blog.csdn.net/haoel 重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。 其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节),一个是字符(1字节),而且还转载 2014-03-06 21:28:56 · 356 阅读 · 0 评论 -
C/C++位运算技巧
预备知识对于位运算,大家都很熟悉,基本的位操作有与、或、非、异或等等。在面试中经常会出现位运算相关的题,所以我就做了简单的整理,参考了很多写的很好的博客及书籍。现在简单说一下,移位运算。左移运算:x 右移运算:x >> y。将x右移y位,这需要区分x是有符号数还是无符号数。在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0。在x是有符号数时,又分为x是正转载 2014-03-19 20:18:48 · 429 阅读 · 0 评论 -
C++中智能指针的设计和使用
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对转载 2014-03-22 10:11:06 · 337 阅读 · 0 评论 -
C++对象的内存分析(6)
前言 本节讨论构造函数,析构函数和虚析构函数。可能很多人都有这样的经历,面试时经常被问到:什么情况下要使用虚析构函数,为什么要使用虚析构函数?本文将试图对编译器的实现机制进行分析,来回答这个问题。 构造函数和析构函数的调用链 我们从例子来分析,首先我们来看下面这个继承链: 代码如下:class CBasi转载 2013-12-13 17:57:02 · 440 阅读 · 0 评论 -
C++对象的内存分析(4)
前言 本章节是4个课题的最后一个,我们将讨论多重继承情况下,对象内存的布局。阅读本文,请思考下面的问题:当子类从多个基类继承,虚函数指针和成员变量将如何布局?编译器如何进行子类和基类之间类型转换?如果多个基类具有同样的虚函数,子类选择哪个实现来调用?如果子类重写该虚函数,那么它覆盖的是哪个基类的实现呢? 多重继承 我们将分析这样的例子:CFinal类继承自CBa转载 2013-12-13 17:55:35 · 363 阅读 · 0 评论 -
C++对象的内存分析(2)
前言 本章节讨论单继承情况下类对象的内存特性。阅读时请思考这几个问题:从子类到基类的类型转换,编译器做了什么?多态是怎么实现的?类的成员函数(包括虚函数)和普通函数有什么区别吗?Subject2:从带虚函数的基类继承的子类 类CFinal是我们要分析的目标,它从CBasic中继承而来,重写(override)了虚函数add;增加了一个新的虚函数;增加了一个成员变转载 2013-12-13 17:53:57 · 486 阅读 · 0 评论 -
C程序编译执行过程
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/187229C程序编译执行过程 认识C编译执行过程,是C学习的开端。简单说C语言从编码编译到执行要经历一下过程: C源代码编译---->形成目标代码,目标代码是在目标机器上运行的代码。连转载 2013-11-29 12:45:14 · 407 阅读 · 0 评论 -
return 0 和 return 1的区别
return 0说明程序是正常返回return 1说明程序是不正常返回也有一种说法作为逻辑判断值return 0 说明假,return 1说明真原创 2013-10-15 20:25:03 · 1264 阅读 · 0 评论 -
位运算符号解释
位运算符号解释:~ 按位取反,将每个1变为0,将每个0变为1。& 位与,只有两个操作数的对应结果都为1时,结果才为1。| 为或,对于每个位,如果其中任意操作数中对应的位为1,那么结果位就为1。^ 异或,对于每个位,如果操作数中的对应位有一个为1(但不是都为1),那么结果为1。原创 2013-10-09 19:12:06 · 561 阅读 · 0 评论 -
溢出和越界的区别
1. 溢出和越界的区别溢出就比如说是用一个桶 往一个杯子倒水,多出来了。越界就是访问了非法的空间。原创 2013-09-26 23:57:26 · 1254 阅读 · 0 评论 -
brk和sbrk及内存分配函数相关
brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这 一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理 下将转载 2013-11-27 22:40:18 · 286 阅读 · 0 评论 -
extern、static、auto、register 定义变量的不同用法
首先得说明什么叫“编译单元”。每个 .c 文件会被编译为一个 .o 文件,这个就是一个编译单元。最后所有的编译单元被链接起来,就是一个库或一个程序。 一个变量/函数,只要是在全局声明的,链接之后都隐含地在所有编译单元中可见。但你的声明可能仅出现在一个 .c 文件中,这就暗示你不想把这个名字暴露给其它编译单元,这种情况下就得用 static 关键字,表示这个名字具有“内部链接”,只对当前编译转载 2013-11-17 23:59:11 · 951 阅读 · 0 评论 -
指针的大小--sizeof问题
指针的大小--sizeof问题 指针的大小是问:一个指针变量占用多少内存空间? 分析:既然指针只是要存储另一个变量的地址,。注意,是存放一变量的地址,而不是存放一个变量本身,所以,不管指针指向什么类型的变量,它的大小总是固定的:只要能放得下一个地址就行!(这是一间只有烟盒大小的“房间”,因为它只需要入一张与着地址的纸条)。 存放一个地址需要几个字节?答案是和一个 i转载 2013-10-27 23:01:08 · 421 阅读 · 0 评论 -
引用参数与引用返回值
经常看到这样的声明:T& func(T& t),这种声明和T func(T t)有什么区别?书上的解释是为了提高效率,究竟是如何提高效率的呢?内部执行了什么操作?本文通过8个小例子对引用参数和引用返回进行了一次彻底的排查。 首先看一下在类的成员函数中的引用参数和引用返回值:类定义class A{ public: int x; A()转载 2013-12-07 11:25:56 · 345 阅读 · 0 评论 -
c++内置类型
C++定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic types),另外还定义了一种称为void的特殊类型。void类型没有对应的值,仅用在有限的情况下。通常用作无返回值的函数的返回类型。算术类型的存储空间依机器而定。类型存储空间是指用来表示该类型的位(bit)数。C++标准保证了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。事实上,对于int转载 2013-11-30 15:24:53 · 344 阅读 · 0 评论 -
C/C++浮点数在内存中的存储方式
C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器转载 2013-10-24 17:42:47 · 300 阅读 · 0 评论 -
const、volatile、mutable的用法
const、volatile、mutable的用法const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。 例如:const转载 2013-10-27 21:54:29 · 288 阅读 · 0 评论 -
空指针
空指针的简单描述:它 “与任何对象或函数的指针值都不相等”。也就是说, 取地址操作符 & 永远也不能得到空指针, 同样对 malloc() 的成功调用也不会返回空指针, 如果失败, malloc() 的确返回空指针, 这是空指针的典型用法:表示 “未分配”或者 “尚未指向任何地方”的指针。=================================================转载 2013-10-17 14:20:00 · 425 阅读 · 0 评论 -
const用法详解
面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也是很耀眼的就const直接可以取代c中的#define以下几点很重要,学不好后果也也很严重const1. 限定符声明变量只能被读 const int i=5; int j=0; ... i=j; //非法,导致编译错误 j=i; //合法2. 必须初始化转载 2013-12-01 14:32:05 · 394 阅读 · 0 评论 -
int main(int argc, char* argv[])用法详解
main函数的参数 我们经常用的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整型变量,argv( 第二转载 2013-12-13 17:43:28 · 452 阅读 · 0 评论 -
彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
一 :关于指针和堆的内存分配先来介绍一下指针: 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量。既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都是4个字节大小,里边只是存储了一个变量的地址而已。不管什么类型的指针,char * ,int * ,int (*) ,string * ,float * ,都是说明了本指针所指向的地址空间是什么转载 2014-05-10 10:45:23 · 415 阅读 · 0 评论