
C++
文章平均质量分 77
ssfp8762
这个作者很懒,什么都没留下…
展开
-
string::size_type类型
string::size_type类型 string::size_type类型 从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节“建议”中所述的无符号整数。但事实上,size操作返回的是string::size_type类型的值。我们需要对这种类型做一些解释。 string类类型和许多其他库类型都定义了一些伙伴类型(companion types)。这些伙伴类型使得库类型的使用转载 2009-12-17 22:43:00 · 1558 阅读 · 1 评论 -
Keil C中用unsigned long要注意的问题
Keil C里用到了unsigned long长整型变量,编译时都能通过,但运行时老是溢出,同伙百度到了此贴,解决了问题,于是转帖于此:今天调试一个乘法,出了点问题,先看代码示意:void test(void){ unsigned long mid1,mid2,mid3; mid1=6*10000;//index1 mid2=7*100转载 2009-11-06 23:07:00 · 4024 阅读 · 1 评论 -
delete p和delete[] p的区别
原文: operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式: void* operator new (size_t); // allocate an object void* operator new [] (size_t); // allocate an array转载 2009-11-07 20:41:00 · 6773 阅读 · 3 评论 -
用循环数组实现队列
我们可以将队列当作一般的表用数组加以实现,但这样做的效果并不好。尽管我们可以用一个游标last来指示队尾,使得Enqueue运算可在O(1)时间内完成,但是在执行Dequeue时,为了删除队头元素,必须将数组中其他所有元素都向前移动一个位置。这样,当队列中有n个元素时,执行Dequeue就需要O(n)时间。为了提高运算的效率,我们用另一种方法来表达数组中各单元的位置关系。设想数组Q[1..Ma原创 2009-10-27 15:15:00 · 2769 阅读 · 0 评论 -
C++内存管理之一(检测内存泄露)
C++程序的复杂性很大一部分在于他的内存管理,没有C#那样的垃圾回收机制,内存管理对初学者来说很困难。经常会出现内存泄露的情况。那么我们写程序如何避免内存泄露呢?首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。 本文描述了如何检测内存泄露。最主要的是纯C,C++的程序如何检测内存泄露。 现在有很多专业的检测工具,比如比较有名的BoundsCheck, 但原创 2009-10-27 10:48:00 · 393 阅读 · 0 评论 -
C++成员初始化列表
类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 初始化阶段可以是显式的或隐式的,取决于是否存在成员初始化表。隐式初始化阶段按照声明的顺序依次调用所有基类的缺省构造函数,然后是所有成员类对象的缺省构造函数。2.进入构造函数后在构造函数中执行一般计算 计算阶段由构造函数体内的所有语句构成。在计算阶段中,数据成员的设置被认为是赋值,而转载 2009-11-06 00:10:00 · 481 阅读 · 1 评论 -
从一道面试题看指针与数组的区别
题记: 关于指针,推荐看一下csdn飞天御剑流的《再再论指针》,相信对C语言指针会有一个更为清晰全面的理解。 指针是C语言的精华,它是一柄“双刃剑”,用的好与坏就看使用者的功力了。下面就一道面试题,看一下指针与数组的区别。 char *p1, *p2;char ch[12];char **pp;p1 = ch;pp = &ch原创 2009-10-24 22:47:00 · 418 阅读 · 0 评论 -
二叉树遍历(非递归)
基于栈的递归消除递归操作隐式地调用系统栈,使时间和空间性能有比较大的损耗。我们可以根据自己的需要调用合适的栈结构,从而提高效率。以中序遍历为例:void InOrderTraverse(BiTree root) { InitStack(&s); //初始化栈s p=root; while( p!=NULL || !IsEmpty(s) ) { //当前访问节点存在或栈不空 if(p!=NULL)转载 2009-10-21 22:04:00 · 416 阅读 · 0 评论 -
拷贝构造函数和赋值运算符的区别[2]
构造函数 构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值 总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载 构造函数与其他方法的区别 1.构造函数的命名必须和类名完全相同;而一般方法则不能和类名相同. 2.构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有转载 2009-09-28 11:27:00 · 757 阅读 · 0 评论 -
拷贝构造函数和赋值运算符区别[1]
一、拷贝构造,是一个的对象来初始化一边内存区域,这边内存区域就是你的新对象的内存区域赋值运算,对于一个已经被初始化的对象来进行operator=操作class A; A a; A b=a; //拷贝构造函数调用 //或 A b(a); //拷贝构造函数调用 /////////////////////////////////// A a;转载 2009-09-28 11:24:00 · 421 阅读 · 0 评论 -
C 风格(C-style)强制转型2
C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(exdivssion) // cast exdivssion to be of type T 这两种形式之间没有本质上的不同,它纯粹就是一个把括号放在哪的问题。我把这转载 2009-09-28 10:49:00 · 347 阅读 · 0 评论 -
c++ 类中static变量初始化问题
首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数:view plaincopy to clipboardprint?void Foo() { static int a=3; // initialize std::cout a++; } void Foo(){ static int a=3; // initialize转载 2009-10-31 10:31:00 · 715 阅读 · 0 评论 -
在C++中,为什么构造函数不能有返回值?
(1)假设有一个类C,有如下定义:class C{public: C():x_(0) {} C(int i):x_(i) {}private: int x_;};如果C的构造函数可以有返回值,比如int: int C():x_(0) { return 1; //1表示构造成功,0表示失败}那么下列代码会发生什么事呢?C c=C(); //此时c.x_==1!很明显,C()调用了C转载 2009-11-08 16:35:00 · 861 阅读 · 0 评论 -
线程同步机制的区别与比较及进程通信方法
有关多线程的一些技术问题:1、 何时使用多线程?2、 线程如何同步?3、 线程之间如何通讯?4、 进程之间如何通讯? 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能是重叠的,但是每个程序应该都可以归于某个领域:1、 offloading time-consuming task。由辅助线程来执行耗时计算,而使GU转载 2009-11-11 00:49:00 · 414 阅读 · 0 评论 -
各种排序方法汇总
1. 基本思想: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。2. 排序过程:【示例】: 初始关键字 [49 38 65 97 76 13 27 49]第一趟排序后 13 [38 65 97 76 49 27 49]第二趟排序后 13 27 [65 97 76 49 38 49]第三趟排序后转载 2009-12-18 21:39:00 · 708 阅读 · 0 评论 -
vc的内存对齐
VC下的结构体和类的默认对齐原则:1.各成员变量存放的起始地址相对于结构的起始地址偏移量必须为该变量类型所占用字节的倍数。2.结构总大小必须为结构的字节边界数(结构中占用最大空间的类型所占字节数)的倍数。没有成员变量的结构体或类的大小为1,因为必须保证结构或类的实例在内存中都有唯一的地址。VC中修改默认对齐方式:#pragma pack(push) // 保存对齐状态#pragma pac原创 2009-12-13 12:20:00 · 404 阅读 · 0 评论 -
再谈内存对齐问题
一、什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某原创 2009-12-13 12:13:00 · 396 阅读 · 0 评论 -
c语言宏定义的连接符有哪些
c语言宏定义的连接符有哪些 收藏 c语言宏定义的连接符有哪些[此问题的推荐答案](一)宏定义中的## 连接符与# 符 ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得转载 2009-12-13 11:53:00 · 343 阅读 · 0 评论 -
约瑟夫环数学解法
学了四年,还是不一样的。当年大一时约瑟夫环是个啥都理解了半天,现在可以在十分钟里面自己写个算法了,真是值得纪念。约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。例如:n = 9, k = 1, m = 5【解答】出局人的顺转载 2009-12-08 16:29:00 · 986 阅读 · 3 评论 -
malloc函数
原型:extern void *malloc(unsigned int num_bytes); 头文件:#include 或 #include (注意:alloc.h 与 malloc.h 的内容是完全一致的。) 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函转载 2009-12-08 22:10:00 · 290 阅读 · 0 评论 -
C/C++ 误区 —— 强制转换 malloc() 的返回值
首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中可以是 cstdlib) ,而不是 malloc.h 。因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过!因此并非所有编译器都有 malloc.h 这个头文件。但是所有的 C 编译器都应该有 stdlib.h 这个头文件。 在 C++ 中,强制转换 malloc() 的返回值是必须的,否则不转载 2009-12-08 21:46:00 · 716 阅读 · 0 评论 -
什么是AV错误?我该如何调试它?
当你运行程式得到了一个AV(Access Violation)错误的时候,这意味着你的程式正在试图访问一块不再有效的内存,请注意我所提到的“不再”有效。大多数的情况下,出现这个错误要么是因为你试图访问一块已经被释放的内存,要么是想使用一个还未创建对象的指针。幸运的是:Win32的内存体系在不同的进程(Process)间使用了独立的地址空间。所以我们可以不必担心会访问到其他的进程中的地址转载 2010-01-19 16:09:00 · 922 阅读 · 0 评论 -
多线程编程同步技巧
简介本文探讨基本的同步概念,并实际动手帮助新手掌握多线程编程。本文的重点在各种同步技巧。基本概念在线程执行过程中,或多或少都需要彼此交互,这种交互行为有多种形式和类型。例如,一个线程在执行完它被赋予的任务后,通知另一个线程任务已经完成。然后第二个线程做开始剩下的工作。下述对象是用来支持同步的:1)信号量2)互斥锁3)关键区域4)事件每个对象都有不同的目的和转载 2009-11-11 00:36:00 · 453 阅读 · 0 评论 -
跟类的内存结构有关的
许多同学可能在学习C++的时候,都会感到一定的困惑,继承到底是怎样分配空间的,多态到底是如何完成的,许许多多的问题,必须挖掘到C++底层处理机制,才能搞明白。有许多C程序员也并不认同C++,他们认为C++庞大又迟缓,其更重要的原因是,他们认为“C++是在你的背后做事情”。的确,C++编译器背着程序员做了太多的事情,所以让很多不了解其底层机制的人感到困惑。想成为一个优秀的程序员,那么这样的困惑就不应转载 2009-09-26 11:15:00 · 347 阅读 · 0 评论 -
Stack和Heap的区别
【继续深入】Stack和Heap的区别(1)每个应用程序运行时,都有属于自己的一段内存空间,用于存放临时变量、参数传递、函数调用时的PC值的保存。这叫stack。(2)所有的应用可以从一个系统共用的空间中申请供自己使用的内存,这个共用的空间叫heap。(3)stack中的对象或变量只要定义好就可使用了,应用程序结束时会自动释放。(4)而要使用heap中申请的变量或对象只能定义变量指针,并要求在运行转载 2009-09-25 20:42:00 · 254 阅读 · 0 评论 -
Release版与Debug版程序的问题(转载)
一、Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。 Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还转载 2009-08-04 17:33:00 · 346 阅读 · 0 评论 -
调用C++复制构造函数和拷贝构造函数
1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中,而不是常规的赋值过程中。类的复制构造函数原型通常如下: class_name(const class_name&); 它接受一个指向类对象的常量引用作为参数。例如,String类的复制构造函数的原型如下: String(const String&); 新建一个对象并将其初始化为同类现有对象原创 2009-07-31 22:08:00 · 305 阅读 · 0 评论 -
构造、析构函数
构造函数不能为虚函数而析构函数可以为虚函数基类函数为虚函数则派生类函数也为虚函数! 派生类创建时无论构造函数是不是虚函数,则首先调用基类的构造函数然后调用派生类的构造函数,派生类对象析构时,首先调用派生类的析构函数,然后调用基类的析构函数。基类析构时,若析构函数不是虚函数则只调用基类的析构函数,如果析构函数为虚函数则基类析构时首先调用派生类的析构函数然后调用基类的析构函数。上述原创 2009-05-08 21:57:00 · 399 阅读 · 0 评论 -
extern "c" (1)
extern "c" 表示函数使用C的连接方式,也就是说能被C语言写的程序调用(C和C++的连接方式是不一样的)。 联想 extern "C++"大概也知道了吧 在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明? 因为 C 语言和 C++ 语言的编译规则不一样,所以要告诉系统哪些函数是用 C 方式原创 2009-05-07 16:26:00 · 319 阅读 · 0 评论 -
[zz]回调函数
简介 对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。原创 2009-07-16 16:43:00 · 209 阅读 · 0 评论 -
虚函数和纯虚函数
除了继承外,C++的另一个优良特性是支持多态,即允许将派生类的对象当作基类的对象使用。如果A是基类,B和C是A的派生类,多态函数Test的参数是A的指针。那么Test函数可以引用A、B、C的对象。示例程序如下: class A { public: void Func1(void); };原创 2009-04-28 20:06:00 · 307 阅读 · 0 评论 -
C++构造函数与析构函数执行顺序 ?
今天在测试一个构造函数和析构函数的用例的时候,发现我们所钟爱的VC6.0实在是Bug问题越来越多,对于学习C++的新手来讲,有必要在这里给大家说明一下。 构造函数顺序为: 全局对象的构造函数; main函数中对象的构造函数,包括automatic、static依次调用; main中遇到函数中有局部对象时,进入到函数中调用局部对象的构造函数。 注:sta转载 2009-04-27 17:01:00 · 4622 阅读 · 2 评论 -
什么是堆内存分配栈内存分配
五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收转载 2009-04-27 17:56:00 · 1026 阅读 · 3 评论 -
关于电梯算法的C++实现
众所周知,面向对象的程序设计更适合对现实生活中的描述,更加体现了软件的工业化的精神,所以现在大部分的软件开发工作都围绕OOP的思想来进行的。但是在对现实生活中的实际问题,如何对所研究的系统进行面向对象的分析与设计呢?本篇文章以一个实际的例子,向大家介绍一下如何对实际问题进行分析和设计。 一.问题描述: 该实例是一个电梯载客问题,问题的描述如下: 某贸易中心共10层,设有载客电梯1原创 2009-04-23 15:51:00 · 730 阅读 · 0 评论 -
什么是COM组件
COM是Component Object Model (组件对象模型)的缩写。 用户需要什么样的软件产品?这是一个多选题,但高效,健壮是肯定会被选种的。作为一名软件开发人员如何做才能满足用户的需要呢?必须要保证升级应用时不破坏与以前版本的向后兼容性。必须做到扩展系统服务时不依赖特定的操作系统。面向对象的程序设计显然是一次革命性的改变。采用面向对象的设计方法我们可以很容易的把要解决的问题事原创 2009-04-19 22:31:00 · 362 阅读 · 0 评论 -
用数组模拟堆栈
// simulateStackusingArray.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;const int size = 100;template class IStack...{public: IStack(); T pop (); int push (T);原创 2009-08-20 16:47:00 · 320 阅读 · 0 评论 -
C++类中的4个特殊函数 - 缺省构造函数、拷贝构造函数、拷贝赋值操作符和析构函数
C++类中的4个特殊函数 - 缺省构造函数、拷贝构造函数、拷贝赋值操作符和析构函数 收藏 a. C++标准中提到“The default constructor, copy constructor and copy assignment operator, and destructor are special member functions.[Note: The implementation转载 2009-08-31 15:49:00 · 674 阅读 · 0 评论 -
c++中const的作用
const给人的第一印象就是定义常量。 (1)const用于定义常量。 例如:const int N = 100;const int M = 200; 这样程序中只要用到 N、M 就分别代表为整型100、200,N、M 为一常量,在程序中不可改变。 但有人说他编程时从来不用const定义常量。我相信。但他是不懂得真正的编程艺术,用const定义常量不仅能方便我们转载 2009-08-31 16:17:00 · 267 阅读 · 0 评论 -
sqlserver只有MDF文件恢复数据库的方法[转帖]
在查询中执行下列语句 EXEC sp_attach_single_file_db @dbname = testdb, @physname = E:/Test/testdb.MDF 注:testdb 为恢复的数据库名 E:/Test/testdb.MDF 为MDF文件的物理路径原创 2009-09-24 15:31:00 · 299 阅读 · 0 评论 -
VC++6.0中的预编译头
在很多程序中,每个源文件都存在一些相同的部分。比如要包括相同的一些头文件,而且这些头文件可能很长,例如window.h。如果用普通的方法编译这些源文件,对这些头文件在每个源文件中的出现都要重新编译,作了很多重复工作。如果能将这些头文件专门进行编译,并且把结果存储起来。然后在编译包含这些头文件的源文件时,使用上述结果替代头文件在源文件中的出现,就可以大大减少工作量。Microsoft Visual原创 2009-09-17 10:00:00 · 1155 阅读 · 0 评论