![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c/c++
AllenAmanda
每天进步一点点
展开
-
设计模式之单例模式(c++)实现及问题
《Singleton.h》#include#includeusing namespace std;class A{public: static A* GetInstance(); void ShowAddress();private:A();virtual ~A();static A* m_p;};《Sin原创 2012-06-17 21:47:47 · 1307 阅读 · 0 评论 -
设计模式之AbstractFactory模式
<br />设计模式的目的就是尽量减少“变化”对程序的影响,尤其是对客户程序的影响。AbstractFactory模式作为创建型模式的一种,解决的就是“new”在变化中可能引起的问题。<br /><br />先来看看new有何种不好,举个创建汽车的车门的例子:<br />很自然的一种想法是:Door *door = new Door();<br />但是如果遇到创建老爷车的车门,创建现代车的车门,这段代码就无所适从了。<br /><br />OO为我们提供了哪些精华的思想?“封装”,是的,将车门的创建封装起原创 2010-10-16 09:07:00 · 586 阅读 · 0 评论 -
virtual析构函数的作用?
<br />大家知道,析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为vitual有什么作用呢?请看下面的代码:<br />1 #include <br />2 using namespace std;<br />3<br />4 class Base<br />5 {<br />6 public:<br />7 Base() {}; //Base的构造函数<br原创 2010-10-15 23:26:00 · 1640 阅读 · 0 评论 -
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件原创 2010-10-13 22:36:00 · 563 阅读 · 0 评论 -
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
<br /><br />static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? <br />全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即原创 2010-10-13 22:17:00 · 502 阅读 · 0 评论 -
多态和虚函数详解(读书笔记)
一.多态性的概念:1.多态:在面向对象方法中一般是这样表述多态性的: 向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也可以说,多态性是“一个接口,多种方法”。2.从系统实现的角度看,多态性分为两类: 静态多态性和动态多态性。以前学过的函数重载和运算符重载实现的多态性属于静态多态性,动态多态性是通过虚函数(virtual function)实现的。3.静态多态性是指:在程序编译时系统就能决定调用的是哪个函数,因此静态多态性又称编译时的多态性。动态多态性是在程序运原创 2010-10-13 00:55:00 · 574 阅读 · 0 评论 -
指针与引用的区别与联系
<br />1. 概述:<br />从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。<br />而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。<br />在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:<br />指针传递参数本质上是值原创 2010-10-13 00:34:00 · 500 阅读 · 0 评论 -
类的封装、继承和多态
类是对对象的一个抽象,同时类也为对象进行了封装。所谓封装是说类的设计者只是为使用者提供类 对象可以访问的部分,而对于类中其他隐藏起来的成员变量 方法,用户不能访问。 实现方式:A:在类的定义中设置对对象中成员变量和方法进行访问的权限; B:提供一个统一的供其他类引用的方法; C:其它对象不能直接修改文本对象所拥有的属性和方法。2。访问权限: A:private的成员变量和方法只能被这个类原创 2010-10-13 01:04:00 · 615 阅读 · 0 评论 -
构造函数与析构函数(读书笔记)
<br />构造函数与析构函数(读书笔记)<br />一. 构造函数:<br />1.基本概念:<br />(1) 类的数据成员是不能在声明类时初始化的,如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化,反之,如果数据成员是私有的,或者类中有private或protected的成员,就不能用这种方法初始化。<br />(2) 作用:处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。<br />(3) 构原创 2010-10-13 00:58:00 · 640 阅读 · 0 评论 -
百度面试
<br /> 1.广度优先遍历、深度优先遍历。递归、非递归<br /> 2.1k内存、1Mhz的处理器(每秒改变10^6次状态),求:能够在这台计算机上运行且确定性中止的所有程序中,最长运行时间<br /> 3.找出下列代码中存在的安全隐患<br /> struct complex_t<br /> {<br /> int real;<br />原创 2010-10-07 20:50:00 · 604 阅读 · 0 评论 -
C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
<br /><br /><br /> <br /><br /> 今天开始这个系列之前,心里有些恐慌,毕竟园子里的高手关于设计模式的经典文章很多很多,特别是大侠李会军、吕震宇 老师的文章更是堪称经典。他们的文笔如行云流水,例子活泼生动,讲解深入浅出。好在他们都是用C#描述,也没有提供必要的源码下载,所以我这里用C++实现。首先我想声明的是我的文笔绝对不如他们的好,例子也没有他们的形象,不过我打算把C++的代码实现和类图提供给大家,就算作为一种补充吧。<br /><br /> 开始设计模原创 2010-10-16 09:11:00 · 731 阅读 · 1 评论 -
怎样 对40亿个8位正整数进行排序
<br />这里可以借鉴快速排序的思想,将整个数据量进行分解,取8位正整数的中间值128,凡是大于这个数的值都放入文件b,小于128的都放入文件a。然后再按照这种方法一直分解直到任意一边的数量小于1千万为止,然后使用快速排序对这1千万进行排序,最后将结果存入文件中,然后便不再对该数据集进行处理。由于内存牵涉到运算的效率和性能,所以,每分解一次,都要将分解的结果放入文件中。最后就是对这些所有的文件中的结果进行合并,这里可以考虑用一个链表存放所有文件结果集的次序(也是所有排序结果的次原创 2010-10-15 23:57:00 · 2166 阅读 · 1 评论 -
有10亿个浮点数,从中找出1万个最大的数。
<br />1、给一个基于最小二叉堆的方案: <br /><br /> 第一阶段,向最小二叉堆中插入前一万个浮点数; <br /><br /> 第二阶段,从第一万零一个浮点数开始,将之与最小二叉堆顶部的最小值比较。如果小于这个最小值,把最小值弹出并将新值插入到二叉堆中。重复此过程直到遍历完成。<br /> <br /> <br />2、可以用分段的方法,在数据结构版看mathe给的(可能题目不太一样),大致是这样的: <br /> <br /> 开一个100万的数组, <br /> 1,读入100万的数据原创 2010-10-16 00:02:00 · 1244 阅读 · 0 评论 -
C++=》设计模式之模板模式(Template Method)
《TemplateMethod1.h》#include #include using namespace std;class A{public: A(){}; virtual ~A(){}; void Method();protected: virtual void b() = 0; virtual void c()原创 2012-06-17 12:58:30 · 1046 阅读 · 0 评论 -
C++拷贝构造函数(深拷贝,浅拷贝)------别人写的很好,参考一下。
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include iostream>using name转载 2011-10-10 14:41:26 · 667 阅读 · 0 评论 -
链接器算法
去原文 什么是链接器?链接器的工作是把一个或多个目标模块(典型地,就是OBJ文件)组合成一个可执行文件(也就是EXE或DLL)。什么是目标模块呢?目标模块是由一个程序产生的,这个程序把人类可读的文本转换成CPU可以理解的机器代码和数据。对于C++来说,C++编译器读取C++源文件。对于汇编语言来说,汇编程序(例如MASM)读取汇编语言(ASM)文件,这种文件包含与CPU使用的代码和数据等价的指令。目标模块中的主要部分是机器代码和数据。组成代码和数据的原始的字节被存储在连续的块中,这种块叫做节(section原创 2010-10-26 10:52:00 · 825 阅读 · 0 评论 -
判断单链表环的问题
<br />判断单链表环的问题<br />算法杂类 2010-01-20 17:15:42 阅读48 评论0 字号:大中小 订阅<br />有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。<br />问题:<br />1、如何判断一个链表是不是这类链表?<br />2、如果链表为存在环,如果找到环的入口点?<br />解答:<br />一、判断链表是否存在环,办法为:<br />设置两个指针(fast, slow),初始值都指向头,slow每转载 2010-10-27 17:29:00 · 519 阅读 · 0 评论 -
C++编译连接过程(网上摘取)
修改浏览权限 | 删除C++程序从编译到链接然后再到调用的整个过程如下。 <br />只是个人最近观点,希望能与志同道合的同学一起讨论。 <br /><br />注:这里只是研究C++的主流编译过程,与Java没有任何关系,因为使用的技术完全不一样(Java是编译和解释结合的语言)。并且由于不同的编译器厂商对于程序的编译过程不尽相同,但是主要流程还是一样的。 <br /><br />其实长久以来我就一直很不清楚obj文件的内容到底是什么,有人说是汇编,有人说是机器语言。如果是机器语言的话,那编译的过程是怎样转载 2010-10-26 16:05:00 · 601 阅读 · 0 评论 -
百度面试
<br />1/main函数可以包含在头文件中么<br />2/WINDOWS消息响应机制<br />3、快排,归并,动态规划<br />4、fork()函数<br />5、贪吃蛇设计<br />6、c语言可以实现多态么,为什么<br />7、c++特性<br />8、容器原理<br />9、源文件编译链接过程<br />10、stl模板<br />11、设计模式<br />12、进程通信<br />13、滑动窗口<br />14、搜索技术,网页爬行。原创 2010-10-25 21:57:00 · 814 阅读 · 0 评论 -
(转)fork()函数详解
<br />fock 的意思是复制进程, 就是把当前的程序再加载一次, 不同之处在,加载后,所有的状态和当前进程是一样的(包括变量)。 fock 不象线程需提供一个函数做为入口, fock后,新进程的入口就在 fock的下一条语句。一个现存进程调用f o r k函数是U N I X内核创建一个新进程的唯一方法(这并不适用于前节提及的交换进程、i n i t进程和页精灵进程。这些进程是由内核作为自举过程的一部分以特殊方式创建的)。<br /><br /><br />----------------------原创 2010-10-19 08:37:00 · 805 阅读 · 0 评论 -
关于malloc(0)的问题
<br />ANSI C的,如果认为malloc(0)是语法错误的话,下面我写的就不用看了。<br />下面进入正题,关于malloc(0)这个问题,我在网上看到有个面试题好像就是问这个的,原题好像是:<br />char *ptr; <br />if ((ptr = (char *)malloc(0)) == NULL) <br />puts("Got a null pointer"); <br />else <br />puts("Got a valid pointer"); <br />该代码的输出是原创 2010-10-18 23:00:00 · 1420 阅读 · 1 评论 -
linux中fork()函数详解(原创!!实例讲解)
linux中fork()函数详解(原创!!实例讲解)作者: freeandeasywu 时间: 2010-07-23<br />一、fork入门知识<br /> 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。<br /> 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到转载 2010-10-19 08:43:00 · 626 阅读 · 0 评论 -
哪些设计模式最值得学习
<br />最近又在首页看到几篇设计模式相关的学习随笔。回想起来,这几年在园子里发布的有关设计模式的随笔都有一个共同的特点。那就是Factory和Singleton居多,如果是系列的,也往往是从这两个模式开始的。由于能够坚持把《设计模式》中所有模式都写完的非常少,所以基本上也很少见到有关其它模式的随笔。<br /> <br />这种情况也很好理解,因为《设计模式》这本书就是按照这个顺序来的。最先讲述的就是Abstract Factory模式,于是它排第一也无可厚非;排第二的Builder基本不太容易见到;第转载 2010-10-16 09:01:00 · 747 阅读 · 0 评论 -
海量数据面试题整理
<br />1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?<br />方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。<br />s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。<br />s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记原创 2010-10-03 17:17:00 · 485 阅读 · 0 评论 -
排序算法
<br />//T(n)为时间复杂度,S(n)为空间复杂度<br />//直接插入排序,每次都将第i个记录插入到前i-1个有序的记录中<br />//T(n)=O(n2),S(n)=1,稳定排序<br />void InsertSort()<br />{<br /> int j,temp;<br /> for(int i=1;i<n;i++)<br /> {<br /> temp=R[i];<br /> j=i-1;<b原创 2010-10-05 05:46:00 · 596 阅读 · 0 评论 -
指向const对象的指针&&&const指针
<br />1. 指向const对象的指针<br /> 指向const对象的指针是一个指针,但是不能通过它来修改它所指向的对象的值。<br /> 声明方法:<br /> const int *p;<br /> const指针对象在初始化后不允许对指针指向的对象的值进行修改,因此不能用一个普通的指针指向一个const<br /> 指针对象。否则,如果可以用普通指针修改const指针对象的值,那就失去了const的意义。例如:<br /> const int i = 1;<b转载 2010-07-06 09:59:00 · 425 阅读 · 0 评论 -
C++从零开始(二)》 变量
<br /> 赋值语句<br /> 前面已经说明,要访问内存,就需要相应的地址以表明访问哪块内存,而变量是一个映射,因此变量名就相当于一个地址。对于内存的操作,在一般情况下就只有读取内存中的数值和将数值写入内存(不考虑分配和释放内存),在C++中,为了将一数值写入某变量对应的地址所标识的内存中(出于简便,以后称变量a对应的地址为变量a的地址,而直接称变量a的地址所标识的内存为变量a),只需先书写变量名,后接“=”,再接欲写入的数字(关于数字,请参考《C++从零开始(二)》)以及分号。如下:<br转载 2010-07-06 17:31:00 · 371 阅读 · 0 评论 -
do...while(0)
<br />在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中<br />作循环时, 我们可能用for和while要多一些,do...while相对不受重视。<br /> 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法<br />,不是用来做循环,而是用作其他来提高代码的健壮性。<br /><br />1. do...while(0)消除goto语句。<br />通常,如果在一个函数中开始要分配一些资源,然后在中途执行转载 2010-07-06 14:53:00 · 565 阅读 · 0 评论 -
C++学习重点分析
<br />一、#include “filename.h”和#include 的区别<br /> #include “filename.h”是指编译器将从当前工作目录上开始查找此文件<br /> #include 是指编译器将从标准库目录中开始查找此文件<br /> 二、头文件的作用<br /> 加强安全检测<br /> 通过头文件可能方便地调用库功能,而不必关心其实现方式<br /> 三、* , &修饰符的位置<br /> 对于*和&修饰符,为了避免误解,最好将修转载 2010-07-06 11:19:00 · 436 阅读 · 0 评论 -
c++中char * 和 char []的区别
<br />问题引入:<br /> 在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者改变其内<br /> 容程序是会崩溃的,而后者完全正确。<br /> 程序演示:<br /> 测试环境Devc++<br /> 代码<br /><br /> #include <iostream><br />using namespace std;<br />main()<br />{<br /> char *c1 = "abc转载 2010-07-06 20:39:00 · 419 阅读 · 0 评论 -
C++ 笔记点滴
<br />1.while(0)二种用法,一种是用于跳转,一种是用于宏<br /> 2.声明变量中的外部变量是用extern,声明寄存器变量是register.<br /> 3.static全局变量,static局部变量,区别在于:虽然都是存放在全局存储区,但全局static作用域为整个文件,局部static变量作用域为声明区域。当定义它的函数或语句块结束时,其作用域随之结束。再次进入后又会恢复其值。<br /> static函数则又称内部函数,即只能被当前文件使用,其他文件不能调用。<b转载 2010-07-06 16:00:00 · 388 阅读 · 0 评论 -
1000的阶乘收集方法
<br />您相信可以只用四行代码算1000阶乘精确值么?(只计算可执行语句行数)<br />以下就是偶的作品(首次发表时间为 2007-4-24 ):<br />#include<stdio.h> <br />#define N 1000 //要计算的N <br />long s[N]={1,1},n=N,t=2,a=1,b=0; <br />int main()//雨中飞燕之作 <br />{ <br /> for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&转载 2010-07-02 17:03:00 · 482 阅读 · 0 评论 -
C++笔试题
<br />C++笔试题<br />1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?<br />答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键.<br />2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个字符存到新文件的第一个字符,以此类推。<br />//实现对一个文本文件内容的反向显示。<br转载 2010-07-03 11:40:00 · 419 阅读 · 0 评论 -
itoa()函数将整数转换为字符串的一个例子
<br />itoa()函数将整数转换为字符串的一个例子:<br /># include <stdio.h><br /># include <stdlib.h><br />void main (void)<br />{<br />int num = 100;<br />char str[25];<br />itoa(num, str, 10);<br />printf("The number 'num' is %d and the string 'str' is %s. /n" ,<br />num, st转载 2010-07-01 20:43:00 · 846 阅读 · 0 评论 -
深入理解C语言(内存对其)
<br />这里重点讨论内存对齐的问题和#pragma pack()的使用方法。<br />什么是内存对齐?<br />先看下面的结构:<br />struct TestStruct1<br />{<br />char c1;<br />short s;<br />char c2;<br />int i;<br />};<br />假设这个结构的成员在内存中是紧凑排列的,假设c1 的地址是0,那么s 的地址就应该<br />是1,c2 的地址就是3,i 的地址就是4。也就是c1 地址为00000000, s转载 2010-06-29 21:47:00 · 103 阅读 · 0 评论 -
常见的排序算法实现
<br />插入排序是最简单最直观的排序算法了,它的依据是:遍历到第N个元素的时候前面的N-1个元素已经是排序好的了,那么就查找前面的N-1个元素把这第N个元素放在合适的位置,如此下去直到遍历完序列的元素为止。<br /> 算法的复杂度也是简单的,排序第一个需要1的复杂度,排序第二个需要2的复杂度,因此整个的复杂度就是<br /> 1 + 2 + 3 + …… + N = O(N ^ 2)的复杂度。<br /><br /> // 插入排序<br />void InsertSort(int arr转载 2010-07-06 20:47:00 · 349 阅读 · 0 评论 -
C++中的引用
<br />C++中的引用<br /><br /><br />【导读】介绍C++引用的基本概念,通过详细的应用分析与说明,对引用进行全面、透彻地阐述 <br /><br /><br />引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。<br /><br />引用简介<br /><br />引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。<br /><br />引用的声明方法:类型标识符 &引用名=目标变量名;<br /><b转载 2010-07-07 21:08:00 · 360 阅读 · 0 评论 -
mutable
<br /><br /> mutable 可以用来指出,即使结构或者类变量为const,其某个成员也可以被修改 例如 struct data { char name[30]; mutable int accesses; .... }; const data veep = {"david";,0,} strcpy(veep.name,"Jimmy");// not allowed veep.accesses++; // allowed veep 的const限定符禁止程序修改veep的转载 2010-07-06 15:44:00 · 321 阅读 · 0 评论 -
大数阶乘N!
<br />#include "stdio.h"<br />#define MAXN 100<br />int a[MAXN];<br />int main()<br />{<br /> int n,m,i,j,c,t;<br /> printf("2<=n&&n<=100/n");<br /> while (1)<br /> {<br /> scanf("%d",&n);<br /> if (n >= 2 && n <= 100)<br /> {<br /> break;<br /> }<br原创 2010-10-03 15:12:00 · 435 阅读 · 0 评论 -
vc中文件字符替换
vc中文件字符替换2007-12-26 22:05<br /><br />CFile m_file("f://test.txt",CFile::modeReadWrite); //这里举个例子 <br />CString lFileContent; //读取的内容 <br />UINT length; //每次选取的长度 <br />char *temp=new char[1024577]; //读取内容的中间变量 <br />memset(temp,0,1024576); <br />DWORD chan转载 2010-09-04 11:15:00 · 2687 阅读 · 0 评论