C/C++
yuanzhangmei1
这个作者很懒,什么都没留下…
展开
-
关于继承更关于静态类型和动态类型检查
首先简单说一下昨晚去趋势笔试情况,今年大改往年今年全部采用中文作答,总的来说题目倒不是很难不过需要知识面特别广,其中涉及到C++,网络,数据结构,算法,同时还有智力测试等等。考的很广但不能所以需要好好打好基础。c++题目大概有一半的题目考的比较活,其中有一个题目印象很深关于继承也关于静态类型和动态类型检查的。所以上午就一直总结了一下。可能有不对的地方欢迎大家指正。1、静态类型和动态类型如果原创 2013-09-24 10:36:17 · 2437 阅读 · 1 评论 -
Struct和Class的区别
转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.htmlC++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。struct能包含成员函数吗? 能!struct能继承吗? 能!!struct能实现多态吗? 能!!! 既然这些它都能实现,那它和class转载 2013-08-30 20:16:02 · 526 阅读 · 0 评论 -
哈希表算法实现
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.环境:主机:WINXP开发环境:MINGW说明:本程序建立的哈希表示意图:哈希函数为对哈希表长取余源代码:本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.环境:主机:WI转载 2013-08-17 09:27:38 · 646 阅读 · 0 评论 -
顺序容器和关联式容器的比较
在STL中,容器被划分为两类:顺序容器和关联式容器(联合容器)。这里的“顺序”和“关联”指的是上层接口表现出来的访问方式,并非底层存储方式。为什么这样划分呢?因为对STL的用户来说,他们并不需要知道容器的底层实现机制,只要知道如何通过上层接口访问容器元素就可以了,否则违背了泛型容器设计的初衷。 STL主要采用向量、链表、二叉树及他们的组合作为底层存储结构来实现容器。尽管一种容器可以采原创 2013-08-16 14:31:10 · 1829 阅读 · 0 评论 -
模板的概念 ---模板分两类:函数模板和类模板
C++模板(一):模板的概念2007年02月01日 星期四 23:13哎呀,贴的顺序有些乱,应该先贴这个来着=。=姑且在标题上标明吧~~****************************************************************当函数重载时,函数名称和执行的功能完全相同,不同的只是函数的返回类型和参数类型,但必须为他们分别定义函数转载 2013-08-14 19:19:03 · 673 阅读 · 0 评论 -
const特别之处
我们知道const修饰的是有类型的,而define却只是简单的代替,其中const的修饰可以进行类型检查可以减少错误,但注意的是const修饰的并不是常量,而只是ReadOnly,它修饰的只读变量并不能作为定义数组的维数也不能放在case后面。(C语言是这样的,但C++扩展了const的含义可以这么用)。const修饰的只读变量必须在定义的同时给予初始化。 说道这里,原创 2012-07-02 22:44:34 · 669 阅读 · 0 评论 -
函数模板与类模板的区别
函数模板与类模板有什么区别?答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。 即函数模板允许隐式调用和显式调用而类模板只能显示调用 这期间有涉及到函数模板与模板函数,类模板与模板类的概念(类似于类与类对象的区别)请看下面例子 注意:模板类的函数声明和实现必须都在头文件中完成,不能像普转载 2013-08-14 18:57:38 · 509 阅读 · 0 评论 -
char类型
单独的char类型应该只用于字符值的存储和使用;有符号和无符号的“char”型变量只能用于数值的存储和使用。char有三种类型:单纯的char,signed char和unsigned char 。signed char和unsigned char类型是用来声明数值的,单独类型的真正的字符类型是用来声明字符的。单纯的char类型由编译环境决定,不能依赖。对于单纯char类型,唯一允许的操作时赋原创 2013-08-24 16:01:55 · 1507 阅读 · 0 评论 -
浮点数的内存表示
判断浮点数是否相等如果用下面的方法: float x = 0.6; if(0.6 == x) { .... } 是不对的,得用下面的方法: if((x - 0.6 = -1e-6)) { ... } 原因是,浮点数在内存中的值不是一个精确值,比如0.6在内存中的值不是绝对与0.6相等。 对于Intel CPU,对32位浮点数的表示转载 2013-03-25 17:28:04 · 637 阅读 · 0 评论 -
设计模式C++实现(4)——单例模式
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。 单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做转载 2013-03-12 16:24:51 · 660 阅读 · 0 评论 -
设计模式C++实现(2)——策略模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍策略模式的实现。 策略模式是指定转载 2013-03-12 09:49:16 · 547 阅读 · 0 评论 -
设计模式C++实现(1)——工厂模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍工厂模式的实现。 工厂模式属于创转载 2013-03-12 09:27:54 · 704 阅读 · 0 评论 -
char (*(*A())[])()意思
分析:1. A是标识符,所以先看包涵标识符的括号,先看 (*A()) ● (*A())中标识符的右边是小括号(),这个后缀表示A 是一个函数 ● (*A())中标识符的左边是星号*,这个前缀表示A函数返回一个指针2. 把(*A()) 作为整体,姑且称作标识符T,重复[1] 的步骤,分析char (*T[])() ●原创 2013-03-11 17:08:49 · 852 阅读 · 0 评论 -
设计模式C++实现(3)——适配器模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍适配器模式的实现。 D转载 2013-03-12 14:58:19 · 563 阅读 · 0 评论 -
UML类图关系大全
1、关联双向关联:C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法。在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关系必须被映射为对象引用或指针。对象引用本身就是有向的,更适合表达我们所讨论的那种关系。所以这种关系在设计的时候比较少用到,关联一般都是有向的。转载 2013-03-08 21:23:25 · 489 阅读 · 0 评论 -
关联、组合、聚合、依赖关系比较
类之间的关系1. 种类: Generalization(泛化),Dependency(依赖关系)、Association(关联关系)、Aggregation(聚合关系)、Composition(合成关系)。2. 其中Aggregation(聚合关系)、Composition(合成关系)属于Association(关联关系),是特殊的Association关联关系。3. Genera转载 2013-03-06 20:46:01 · 496 阅读 · 0 评论 -
C语言和设计模式(继承、封装、多态)
记得还在我们大学C++第一门课的时候,老师就告诉我们说,C++是一门面向对象的语言。C++有三个最重要的特点,即继承、封装、多态。等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。可是,等我工作以后,使用的编程语言更多的是C语言,这时候我又想能不能把C语言变成面向对象的语言呢?等到后来通过思考和实践,我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现转载 2013-01-26 09:57:25 · 412 阅读 · 0 评论 -
Static_cast 与 Dynamic_cast的区别
来自书本上的解释: 用 static_cast ( expression ) 1. static_cast(expression) The static_castlong, int->short etc. 用来数值之间的转化。2. 可以在相关指针之间转换,指针在void * 之间转换,还可以在基类和派生类之间转换。 这些转换是在编译的时候就确定下来转换(无非就是根据继承关转载 2013-09-05 22:50:24 · 6217 阅读 · 0 评论 -
对象内存布局 (1)
内容概要:满足下面2个条件时,1. 父类有虚函数,子类无虚函数(即无虚函数重写或无虚函数覆盖)2. 非虚继承类对象之内存布局 前述相关内容参考:1. http://blog.csdn.net/pathuang68/archive/2009/04/20/4096088.aspx2. http://blog.csdn.net/pathuang68/archive转载 2013-09-07 15:49:49 · 603 阅读 · 0 评论 -
九种常用排序的性能分析总结
间间断断的将9种排序实现,并且将其以博客笔记的形式记录下来;现在就该来综合的分析这九种排序,让我们先来看看其算法复杂度和稳定性的分析结果:算法复杂度以及稳定性分析算法名称平均时间辅助空间稳定性冒泡排序O(n2)O(1)是选择排序O(n2)O(1)否插入排序O(n2)O(1)是自底转载 2013-09-20 17:31:49 · 693 阅读 · 0 评论 -
c++继承中的内存布局
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Objec转载 2013-09-18 20:47:34 · 658 阅读 · 0 评论 -
C++虚继承对象模型
1.为什么需要虚继承如下图所示如果访问Der::Fun or Der::m_nValue就会带来二义性,无法确定是调用Base1的还是Base2的,所以为了解决多重继承情况下成员访问的二义性,引入了虚继承机制。 一般继承 虚继承转载 2013-09-18 17:09:53 · 653 阅读 · 0 评论 -
自己对C++虚继承内存对象模型探讨
本人总结也就是看别人的博客进行总结的,因为我转载的上篇,但是上篇有点错误,所以本人将自己的实践补充下来。看实例:class A {int a;virtual ~A(){}};//此时A的大小就是为sizeof(a)+sizeof(ptr) = 8class B:virtual public A{virtual ~B(){}virtual void myfunB(原创 2013-09-18 18:39:01 · 695 阅读 · 0 评论 -
C中的volatile用法
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。例如: volatile int i=10; int j = i; ... int k = i;转载 2013-09-18 09:42:12 · 666 阅读 · 1 评论 -
对象内存布局 (9)
假定多层继承的各类之间的关系如下图。假定派生类不override基类的虚函数,即Base2不override Base1中声明的虚函数vfBase1(),Base3不override Base2中声明的虚函数vfBase2(),Derived不override Base3中声明的虚函数vfBase3()。 代码如下:#include using namespace std;转载 2013-09-07 16:14:27 · 577 阅读 · 0 评论 -
对象内存布局 (8)
在内存对象布局 (5)的代码中,在Derived类中将三个基类中的虚函数分别覆盖一个,即分别覆盖Base1中声明的vfBase1_1(),Base2中声明的vfBase2_1()以及Base3中声明的vfBase3_1()。保持其他代码不变,修改后的Derived代码如下:class Derived : public Base1, public Base2, public Base3{转载 2013-09-07 16:13:02 · 590 阅读 · 0 评论 -
sizeof与strlen区别
1):sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int 类型。该类型保证能容纳实现所建立的最大对象的字节大小。2):sizeof是运算符,strlen是函数。3):sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以“\0”结尾的。sizeof还可以用函数做参数。4):数组做sizeof的参数不退化,传递给str原创 2013-09-07 16:58:26 · 474 阅读 · 0 评论 -
对象内存布局 (11)
在C++中,一个类实例化得到的结果就是一个对象。一个类包含成员变量和成员函数,其中成员变量又分为nonstatic成员变量和static成员变量;成员函数又可以分为nonstatic成员函数、static成员函数以及virtual成员函数。一个对象包含可能存在的vfptr以及它声明的或基类继承而来的nonstatic成员变量,static成员变量、static成员函数、nonstatic成员函数以转载 2013-09-07 16:17:22 · 587 阅读 · 0 评论 -
对象内存布局 (7)
在对象内存布局 (5)的代码中,在Derived类中覆盖Base1中声明的vfBase1_1(),其他代码不变。修改后的Derived的定义如下:class Derived : public Base1, public Base2, public Base3{public:int m_derived; inline virtual void fd()转载 2013-09-07 16:12:09 · 588 阅读 · 0 评论 -
对象内存布局 (10)
在对象内存布局 (9)基础上做些修改:派生类override基类的虚函数,即Base2 override Base1中声明的虚函数vfBase1(),Base3 override Base1中声明的虚函数vfBase1()和Base2中声明的虚函数vfBase2(), Derived override Base1中声明的虚函数vfBase1()、Base2中声明的虚函数vfBase2()和Ba转载 2013-09-07 16:16:25 · 614 阅读 · 0 评论 -
对象内存布局 (6)
如果在对象内存布局 (5)的代码中,将Base1中的两个虚函数声明删除,同时将main函数中的下面代码注释掉(因为现在只有两张虚函数表了): cout i = 0; tmp = ((int*)&d) + 4; while(virtualFunctionPointer(tmp, i)) {转载 2013-09-07 16:11:01 · 604 阅读 · 0 评论 -
对象内存布局 (5)
内容概要:满足下面3个条件时,1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数2. 非虚继承3. 多重继承类对象之内存布局 前篇: http://blog.csdn.net/pathuang68/archive/2009/04/23/4101981.aspx 多重继承,派生类不重写基类中的虚函数。假定各类之间的关系如下图:转载 2013-09-07 16:07:45 · 613 阅读 · 0 评论 -
对象内存布局 (4)
内容概要:满足下面2个条件时,1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数2. 非虚继承类对象之内存布局 前篇:http://blog.csdn.net/pathuang68/archive/2009/04/23/4101979.aspx 在前面的例子中,恢复原来的两个虚函数vfBase_1()和vfBase_2(),同时在Derive转载 2013-09-07 16:06:12 · 599 阅读 · 0 评论 -
对象内存布局 (3)
内容概要:满足下面2个条件时,1. 父类无虚函数,子类有虚函数2. 非虚继承类对象之内存布局 前篇:http://blog.csdn.net/pathuang68/archive/2009/04/23/4101977.aspx 如果将Base中的两个虚函数删除,情况有会怎么样呢?将Base中的两个虚函数删除,其他保持不变。Base类和Derived类两者之间的关转载 2013-09-07 16:00:54 · 517 阅读 · 0 评论 -
对象内存布局 (2)
内容概要:满足下面2个条件时,1. 父类有虚函数,子类也有虚函数,但子类并没有重写或覆盖父类的虚函数2. 非虚继承类对象之内存布局 续前篇:http://blog.csdn.net/pathuang68/archive/2009/04/23/4101970.aspx 如果在Derived类中增加一个下面的虚函数,会怎么样呢?Base类和Derived类之间的关系如下转载 2013-09-07 15:56:44 · 586 阅读 · 0 评论 -
关于缓冲的小测试
看下面几个程序并分析:1、在vc6.0下#include #include #include void main(){ char buf[] = {'a','b','\r','c','\n','a','\0'}; int size = sizeof(buf); int len = strlen(buf); printf("buf = %s",buf);原创 2012-12-10 15:30:44 · 590 阅读 · 0 评论 -
复制构造函数(copy constructor) .
定义: 只有单个形参,该形参是对本类类型对象的引用(常用const修饰),这样的构造函数成为复制构造函数。使用方式:(1)显示使用----用一个同类型的对象初始化该对象时;(2)隐式使用----将该类型的对象传递给函数或从函数返回该类型对象时。三种类型的复制构造函数:*bitwise copy constructor :逐位复制-----默认方式*合成的 co转载 2012-10-18 10:24:55 · 617 阅读 · 0 评论 -
条款5:使用相同的形式的new和delete
string *stringarray = new string[100]; ... delete stringarray; 上面程序中的stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他们的析构函数永远不会被调用原因:New和delete都同时做了两件事情如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就原创 2012-08-20 08:46:04 · 411 阅读 · 0 评论 -
C++转型操作符:const_cast、dynamic_cast、static_cast、reinterpret_cast
C++转型操作符 C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点,这四个操作符是:const_cast( expression )dynamic_cast( expression )static_cast( expression )reinterpret_cast( expression )在大多数情况下,对于这些操作符你只需要知道原转载 2012-08-19 22:22:43 · 541 阅读 · 0 评论 -
struct成员对齐
对于复合类型(一般指结构和类)的对象,如果它的起始地址能够满足其中要求最严格(或最高)的那个数据成员的自然对其要求,那么它就是自然对其的,如果那个数据成员又是一个复合类型的对象,则依次类推,直到最后都是基本类型的数据成员。什么是“自然对齐要求最严格”呢?举例来说,double变量的地址要能够被8整除,而int变量地址要能被4整除即可,一个bool变量的地址则只需能被1整除。所以double类型原创 2012-08-19 20:45:09 · 472 阅读 · 0 评论