快捷搜索:  
C++中进程和线程概念释疑

C++中进程和线程概念释疑

一个进程通常定义为程序的一个实例。在Win32中, 进程占据4GB的地址空间。与它们在MS-DOS和16位Windows操作系统中不同, Win32进程是没有活力的。这就是说,一个Win32进程并不执行什么指令,它只是占据着4GB的地址空间,此空间中有应用程序EXE文件的代码和数据。EXE需要的任意DLL也将它们的代码和数据装入到进程的地址空间。除了地址空间,进程还占有某些资源,比如文件、动态内存分配和线程。当进程终止时,在它生命期中创建的各种资源将被清除。 但是进程是没有活力的,它只是一个静态的概念。...

C++虚拟函数实现多态性分析

C++虚拟函数实现多态性分析

面向对象程序设计的基本观点是用程式来仿真大千世界,这使得它的各种根本特性非常人性化,如封装、继承、多态等等,而虚拟函数就是c++中实现多态性的主将。为了实现多态性,c++编译器也革命性地提供了动态联编(或叫晚捆绑)这一特征。 虚拟函数亦是mfc编程的关键所在,mfc编程主要有两种方法:一是响应各种消息,进行对应的消息处理。二就是重载并改写虚拟函数,来实现自己的某些要求或改变系统的某些默认处理。 虚函数的地位是如此的重要,对它进行穷根究底,力求能知其然并知其所以然对我们编程能力的提高大有好处。下面且听我道...

去除文件中重复的字符串

去除文件中重复的字符串

本程序假设文件中的字符串以空白(空格、tab 和换行)隔开。如果文件内容为: string vvv http string vvv stdcpp.cn stdcpp cn stdcpp.cn string cvs hvp 则输出为 cn cvs http hvp stdcpp stdcpp.cn string vvv 功能:去除文件中重复的字符串,并将结果按字符串大小顺序输出 #include iostream #include fstream #include set #include string...

基础入门:解密数组名本质

基础入门:解密数组名本质

现在到揭露数组名本质的时候了,先给出三个结论: (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组; (2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量; (3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址! 1、数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的char型数组,所以sizeof(str)的结果为这个数...

C++设计模式之Prototype

C++设计模式之Prototype

一、功能 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 二、结构图 三、优缺点 优点:复制自身。客户不知道需要对象的实际类型,只需知道它的抽象基类即可。(即有继承树的情况) 缺点:必须先有一个对象实例(即原型)才能clone. 四、示例代码 namespace DesignPattern_Prototype {// class Prototype class Prototype //抽象基类 { public: virtual Prototype* Clone() = 0 ; } ;...

C++设计模式之Factory  Method

C++设计模式之Factory Method

一、功能 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 二、结构图 三、实现 (1)在某些情况下,比如仅仅为了创建适当的Product对象而派生新的Creator子类,并且创建不同Product的方法一致时,可以考虑用模板代替继承。如: class Creator { public: virtual Product* CreateProduct() = 0 ; }; template class ConcreteProduct cla...

C++设计模式之Composite

C++设计模式之Composite

一、功能 表示“部分-整体”关系,并使用户以一致的方式使用单个对象和组合对象。 二、结构图 上图中,也可以做些扩展,根据需要可以将Leaf和Composite做为抽象基类,从中派生出子类来。 三、优缺点 优点:对于Composite模式,也许人们一开始的注意力会集中在它是如何实现组合对象的。但Composite最重要之处在于用户并不关心是组合对象还是单个对象,用户将以统一的方式进行处理,所以基类应是从单个对象和组合对象中提出的公共接口。 缺点:Composite最大的问题在于不容易限制组合中的组件。 四...

赋值表达式和逗号表达式

赋值表达式和逗号表达式

C++把赋值运算符连接而成的式子叫做赋值表达式,例如:a=b、a=b+c、a=3等。赋值运算符是一个双目运算符,必须两个参与运算的值,其左边的值叫做l-value,通常是变量或赋值表达式,常量和常变量不可以作为赋值表达式的左值。赋值运算符右端的值叫做r-value,通常一个常量、变量或表达式。 C++把逗号运算符连接的式子叫做逗号表达式,例如:“a,a*3”,“b+3,d/4”等。逗号表达式右被称为顺序求值表达式,它的值是最右端的表达式的值。例如,有如下逗号表达式: a*=5,a+2 假设a=3,该逗号...

类成员函数指针是什么?

类成员函数指针是什么?

很多人对成员函数指针有无解,以为成员函数指针同普通的函数指针区别不大,多了一个参数。 然而实际上却不是。多了个参数,是不假,但他确实不是指针,虽说名字中有指针两个字,但实际上却不是指针。 先看看最简单的使用 class test { public: void func(){printf("call test::func\n");}; }; int main() { void(test::*p)() = test::func; test x; (x.*p)(); } 这里的用法是最常见的,跟普通的函数指针...

基础入门:++和--运算的运用

基础入门:++和--运算的运用

++是C++的自增运算符,作用是使变量自加1;——是自减运算符,作用是使变量自减1.++和——有两种用法,一种是前缀用法,一种是后缀用法。前缀用法如:++i、——i ,后缀用法如i++、i——,前缀用法跟后缀用法的差别在于前缀时++i的值为完成i加1后的值,——i为完成i减1后的值。例如:假设i的初值为3,执行cout++iendl;输出结果为4,而执行couti++endl;输出结果为3.——运算符同理。这是世人皆知的常识,我们不再讨论,现在我们来讨论一点有趣的东西,看如下代码: #include i...

C/C++返回内部静态成员的陷阱

C/C++返回内部静态成员的陷阱

背景 在我们用C/C++开发的过程中,总是有一个问题会给我们带来苦恼。这个问题就是函数内和函数外代码需要通过一块内存来交互(比如,函数返回字符串),这个问题困扰和很多开发人员。如果你的内存是在函数内栈上分配的,那么这个内存会随着函数的返回而被弹栈释放,所以,你一定要返回一块函数外部还有效的内存。 这是一个让无数人困扰的问题。如果你一不小心,你就很有可能在这个上面犯错误。当然目前有很多解决方法,如果你熟悉一些标准库的话,你可以看到许多各式各样的解决方法。大体来说有下面几种: 1)在函数内部通过malloc...

对象布局及多态实现之动态和强制转换

对象布局及多态实现之动态和强制转换

从这部分开始我们除了利用内存的信息打印来进行探索外,更多的会通过跟踪和观察编译器产生的汇编代码来理解编译器对这些语言特性的实现方式。汇编方面知识的讨论超出了本文的范围,我只对和我们讨论相关的汇编代码进行解析。理解本文要讨论的知识并不需要有很完整的汇编知识,但必须了解起码的概念。 下面我们看看引入虚继承后的影响。为了有所对比我们首先看看普通成员函数的调用情况。 执行如下代码,它包括了对象的普通成员函数调用,类的静态成员函数调用、通过指针调用普通成员函数: C010 obj; PRINT_OBJ_ADR(o...