随笔分类 -  理解

摘要:序列性容器::(vector) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方式,但是erase的返回值为下一个有效的迭代器,所以 正确方法为:: for( iter = c.begin(); iter != c.end(); ) iter = c.eras... 阅读全文
posted @ 2011-12-18 22:41 dzqabc 阅读(712) 评论(0) 推荐(0)
摘要:好像没有什么数组常量吧。 普通数组引用 void function(int (&array)[5]) 研究发现,木有定义成功,常量数组是数组中每个成员不能被修改,那数组常量好像也应该是数组中每个成员不能被修改。举例:结构体常量数组struct abc{ int a; int b;};const abc test[1] ={ {2,2},};//常量数组定义方法. 对象数组(对象数组可以不用初始化,只要定义了默认构造函数便会自动调用;倘若没有定义默认订购函数则需要常量数组在初始化时调用)class abc{public: abc(int ap,int bp): ... 阅读全文
posted @ 2011-11-21 21:32 dzqabc 阅读(2295) 评论(0) 推荐(0)
摘要:通常在使用VC进行函数定义时会指定该函数调用方式,诸如: int__stdcallmax(int a, int b) { returna>b?a:b; } int__cdeclmin(int a, int b) { returna<b?a:b; } bool__fastcallequal(int a, int b) { returna=b?true:false; }首先,让我们来分个类,调用方法分为两大类另加一个较特殊的__thiscall.第一类:__stdcall类 别名:WINAPI,CALLBACK,PASCAL。该类特点是:主调函数负责参数入栈,由函数本身负责栈的恢复.第 阅读全文
posted @ 2011-10-31 22:06 dzqabc 阅读(697) 评论(0) 推荐(0)
摘要:首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些物品,但这些物品你没办法自己生产,自然就要等别人生产出来,你才能拿来用。接着就是析构函数了,上面说到子类是将基类的成员变成自己的成员,那么基类就会只存在子类中直到子类调用析构函数后。做个假设:假如在基类的析构函数调用比子类的先,这样会发生什么事呢?类成员终止了,而类本身却还 阅读全文
posted @ 2011-10-31 20:56 dzqabc 阅读(3967) 评论(1) 推荐(3)
摘要:多态是面向对象的基本特征之一。而虚函数是实现多态的方法。那么virtual function到底如何实现多态的呢?1 基类的内存分布情况请看下面的sampleclass A{void g(){.....}};则sizeof(A)=1;如果改为如下:class A{public: virtual void f() { ...... } void g(){.....}}则sizeof(A)=4! 这... 阅读全文
posted @ 2011-10-25 00:16 dzqabc 阅读(5700) 评论(0) 推荐(1)
摘要:vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public 拷贝构造函数和重载的赋值操作符). 其实很容易理解,自定义一些模板时,同样会需要其实例化类型具备默写操作(如大于小于操作等。) 下面一个自定义模板类就需要dump函数了:template<class T>inline static void Dumpvector(const std::vector<T *> &vvector){ std::vector<T *> ::iterator pvectorIt = vvector.begin(); for(; pvectorIt 阅读全文
posted @ 2011-10-15 00:47 dzqabc 阅读(250) 评论(0) 推荐(0)
摘要:公有继承体现 "是一个" 的含义,但是Student "是一个" Person的事实并不说明Student的数组 "是一个" Person数组。 阅读全文
posted @ 2011-10-15 00:30 dzqabc 阅读(309) 评论(0) 推荐(0)
摘要:拷贝构造函数:只有单个形参,并且该形参时本类对象的引用(经常使用const修饰)的构造函数.默认拷贝构造函数:在没有定义拷贝构造函数的时候,编译器将自动生成一个默认拷贝构造函数将执行的操作:对该类的每个成员执行初始化(对于基础类型直接赋值,对于其所有对象成员逐个调用其对应的拷贝构造函数.)特别的:倘若一个类拥有数组成员,默认拷贝构造函数将复制数组(即复制数组中的每一个元素).自定义拷贝构造函数:只... 阅读全文
posted @ 2011-07-28 00:13 dzqabc 阅读(1474) 评论(1) 推荐(0)
摘要:其实只要让编译器确认了你所要取的值是什么,它自然会帮你取得。只是在我们取得函数指针时是不可以指明参数的,这样子我们该如何告诉编译器我们需要神马呢? 在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址; 我们用常规方法获取的地址只是第一种重载的地址. 下面是引用一段del... 阅读全文
posted @ 2011-07-13 00:38 dzqabc 阅读(1586) 评论(0) 推荐(0)
摘要:函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。方法 函数指针的声明方法为: 数据类型标志符 (指针变量名) (形参列表); 注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形... 阅读全文
posted @ 2011-06-30 08:04 dzqabc 阅读(568) 评论(0) 推荐(0)
摘要:Thunk 技术的一个改进 作者:南风 下载源代码 摘要:介绍了 thunk 技术中如何避免直接写机器码。 关键字:Thunk 机器码 this指针 Thunk技术,一般认为是在程序中直接构造出可执行代码的技术(在正常情况下,这是编译器的任务)。《深度探索C++对象模型》中对这个词的来源有过考证(在中文版的162页),说thunk是knuth的倒拼字。knuth就是大名鼎鼎的计算机经典名著《Th... 阅读全文
posted @ 2011-06-29 00:37 dzqabc 阅读(514) 评论(0) 推荐(0)
摘要:2009年7月30日 kunlun 发表评论 阅读评论 链接: C++虚函数探索笔记(1)——虚函数的简单示例分析 C++虚函数探索笔记(2)——虚函数与多继承 C++虚函数探索笔记(3)——延伸思考:虚函数应用的一些其他情形 关注问题: 虚函数的作用 虚函数的实现原理 虚函数表在对象布局里的位置 虚函数的类的sizeof 纯虚函数的作用 多级继承时的虚函数表内容 虚函数如何执行父类代码 多继承... 阅读全文
posted @ 2011-06-28 00:31 dzqabc 阅读(2413) 评论(0) 推荐(0)
摘要:C++虚函数探索笔记(1)——虚函数的简单示例分析 C++虚函数探索笔记(2)——虚函数与多继承 C++虚函数探索笔记(3)——延伸思考:虚函数应用的一些其他情形 关注问题: 虚函数的作用 虚函数的实现原理 虚函数表在对象布局里的位置 虚函数的类的sizeof 纯虚函数的作用 多级继承时的虚函数表内容 虚函数如何执行父类代码 多继承时的虚函数表定位,以及对象布局 虚析构函数的作用 虚函数在QT的... 阅读全文
posted @ 2011-06-22 00:28 dzqabc 阅读(430) 评论(0) 推荐(0)
摘要:inline int static_test(){ static int i =0; ...}inline 代表编译时代码拷贝,也就有多份副本了,但在VC中测试,i只有一份副本,那么编译器是如何实现的:1.代码拷贝不一定是c代码的拷贝吧,可以是编译后的汇编代码的拷贝。而函数在代码段,变量则在数据段。拷贝的只是函数部分。静态变量在函数部分保存的仅仅是该变量的地址。2.static变量不是放在栈里的,是放在静态数据区.和全局变量存放在一起.不能将它和局部变量混为一谈。 阅读全文
posted @ 2011-06-22 00:09 dzqabc 阅读(1540) 评论(0) 推荐(0)
摘要:1. 指针的来源 在当代,大多数的现代计算机都会把内存分割成字节,每个字节都有着其唯一的地址。可执行程序由代码和数据两部分构成,而程序中的每个变量都占有着一个或多个字节,也就是说,每个变量都有着自己的地址。而这个就是指针的来源。 其实每个地址就是一个数,但是我们却不能用数来表示地址,存储地址,我们需要用指针变量。例如int *p = i,我们就可以说p是指针变量,存储着变量i的地址。 那么我们说... 阅读全文
posted @ 2011-06-17 00:47 dzqabc 阅读(229) 评论(0) 推荐(0)
摘要:1. 数组作为函数参数 函数是我们学习程序设计语言最基本的东西了,我在此不再赘述。只讨论一种特殊情况,就是数组作为函数的参数传递。 我们都知道,其实在传递数组的时候,实际上是传递了数组首元素的指针。明确了这一点之后,我们就可以思考下面的问题。 既然他只是传递了数组首元素的指针,那么他必然无法知道整个 阅读全文
posted @ 2011-06-17 00:44 dzqabc 阅读(380) 评论(0) 推荐(0)
摘要:1. 数组大小 我相信,在C#/Java中,更多的人愿意用List<T>来取代数组,一方面是List提供了较多的方法,另一方面也无需我们去指定数组的大小。 那么在C语言中,我们既然需要必须指定数组的大小,而一般来讲,很多数组大小事我们无法确定并且经常会发生变化的,那么我们最好的方式就是用宏定义来限定数组的大小。#define SIZE 10int main (void){ int a[SIZE]... 阅读全文
posted @ 2011-06-17 00:39 dzqabc 阅读(294) 评论(0) 推荐(0)
摘要:1. typedef 在前文中,我们用宏定义来定义了一个BOOL类型,那么现在就用更专业的方式来定义类型。typedef int Bool;int main (void){ Bool flag=1; if(flag) { printf("True"); } else { printf("false"); }}typedef 的作用就是类型定义(Type Definition)。类型定义有以下三个... 阅读全文
posted @ 2011-06-17 00:38 dzqabc 阅读(212) 评论(0) 推荐(0)
摘要:1.定义函数模板 2.使用模板函数 输出结果 3.确定返回的参数 若两个参数不正确,或者不支持模板定义的特性,编译时则会出错 4.多个模板参数 示例 返回值是T1,所以返回是int类型,结果是42,出错了 定义3个参数,第3个参数用于表示返回值类型 测试 返回正确的42.1 5.模板函数重载 重载函 阅读全文
posted @ 2011-06-13 01:05 dzqabc 阅读(2067) 评论(0) 推荐(0)
摘要:c++模板类/模板函数的声明与定义应该放在头文件里,不要分开来写类中函数的声明与定义(比如在.H文件里声明某个成员函数,在.CPP文件里定义该成员函数),这样会导致连接错误。所应该将模板类/模板函数的定义与声明写在一个.h文件里。可以理解为:模板函数并非函数定义,不能放在CPP文件中。模板函数的函数定义是用编译器编译时生成的。 阅读全文
posted @ 2011-04-15 00:51 dzqabc 阅读(1017) 评论(0) 推荐(0)