随笔分类 -  C/C++

摘要:###基础学习——gcc编译> 编译——就是一个将源代码翻译成计算机处理器能识别的语言的过程。####gccgcc是linux系统中通用的c编译器。举例说明:```test.c#include int main(void){ printf("Hello world\n"); return 0;}``... 阅读全文
posted @ 2015-07-29 22:33 fly1988happy 阅读(398) 评论(0) 推荐(0) 编辑
摘要:1.为什么要定义虚析构函数?如果有一个带有虚函数功能的类,则它需要一个虚析构函数,原因如下:1)如果一个类有虚函数功能,它经常作为一个基类使用;2)如果它是一个基类,它的派生类经常使用new来分配;3)如果一个派生类对象使用new来分配,并且通过一个指向它的基类的指针来控制,那么它经常通过一个指向它的基类的指针来删除它(如果基类没有虚析构函数,结果将是不确定的,实际发生时,派生类的析构函数永远不会被调用);基类有虚析构函数的话,最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。2.声明为保护(protected)的析构函数如果在一个派生类中定义了基类以外的成员对象,且基类析构函 阅读全文
posted @ 2012-10-17 12:24 fly1988happy 阅读(922) 评论(0) 推荐(0) 编辑
摘要:1. 多态在面向对象语言中,接口的多种不同实现方式即为多态。多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数。多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的。多态可以让父类的指针有“多种形态”,这是一种泛型技术。(所谓泛型技术,就是试图使用不变的代码来实现可变的算法)。2. 虚函数2.1虚函数定义在基类的类定义中,定义虚函数的一般形式:Virtual 函数返回值类型 虚函数名(形参表){函数体}虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public。2.2 虚函数的作用虚函数的作用是实现动态联编,也就是在程序的 阅读全文
posted @ 2012-09-25 11:57 fly1988happy 阅读(12470) 评论(8) 推荐(5) 编辑
摘要:1. new与operator newC++中有很多语法让人难以理解,如:new operator(操作符,下同)和operator new之间差异,确切的说,应该是new与operator new 的区别。1.1 new operator如下代码:string *ps=new string("memory management");这里所使用的new就是所谓new operator,是由C++语言内建的,就像sizeof那样,不能改变意义,总是做相同的事情。这个动作的含义分为两方面:第一,它分配足够的内存,用来放置某类型的对象。对于上例而言,它分配足够放置一个string 阅读全文
posted @ 2012-04-26 11:26 fly1988happy 阅读(5970) 评论(1) 推荐(2) 编辑
摘要:1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。1.2 void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间,返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制 阅读全文
posted @ 2012-04-26 10:09 fly1988happy 阅读(38977) 评论(5) 推荐(18) 编辑
摘要:一 普通的static关键字1. 静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:1.1 该变量在全局数据区分配内存; (1)未经初始化的静态全局变量会被程序自动初始化为0( 在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0); (2)静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;(3)静态全局变量不能被其它文件所用; (4)其它文件中可以定义相同名字的变量,不会发生冲突;1.2 全局变量和全局静态变量的区别:1)全局变量是不... 阅读全文
posted @ 2012-04-18 22:21 fly1988happy 阅读(979) 评论(0) 推荐(1) 编辑
摘要:1. 空指针、NULL指针、零指针1.1什么是空指针常量0、0L、'\0'、3 - 3、0 * 17 (它们都是“integer constant expression”)以及 (void*)0 (我觉得(void*)0应该算是一个空指针吧,更恰当一点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L);至于 C++ 系统,由于存在严格的类型转化的要求,void* 不能象 C 中那样自由转换为其它指针类型,所以通常 阅读全文
posted @ 2012-04-16 17:20 fly1988happy 阅读(39150) 评论(3) 推荐(10) 编辑
摘要:1. 增加restrict指针 C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函数所分配的内存变量。restrict数据类型不改变程序的语义。 如果某个函数定义了两个restrict指针变元,编译程序就假定它们指向两个不同的对象,memcpy()函数就是restrict指针的一个典型应用示例。C89中memcpy()函数原型如下:void *memcpy (void *s1, const void *s2, size_t ... 阅读全文
posted @ 2012-04-13 11:16 fly1988happy 阅读(6503) 评论(0) 推荐(0) 编辑
摘要:1.C语言中的结构体1.1 定义结构体是由一系列相同或不同类型的变量组成的集合。struct 结构体名{ //struct为关键字,“结构体名”为用户定义的类型标识。数据类型1 成员名1; //{ }中是组成该结构体的成员,其中数据类型可以是C语言所允许的任何数据类型。数据类型2 成员名2;...数据类型n 成员名n;};1.2 结构体的内存分配(方法一)结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该 阅读全文
posted @ 2012-04-12 21:03 fly1988happy 阅读(8780) 评论(0) 推荐(3) 编辑
摘要:1. 抛出异常1.1 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为: throw 表达式;如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C++使用数据类型来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。 1.2 抛出异常实际是作为另一种返回值来使用的。 抛出异常的好处一是可以不干 阅读全文
posted @ 2012-04-11 17:57 fly1988happy 阅读(11839) 评论(0) 推荐(4) 编辑
摘要:宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。1.不带参数的宏定义:宏定义又称为宏代换、宏替换,简称“宏”。 格式: #define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为“宏名”,字符串可以是常数、表达式、格式串等。 在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。 即在对相关命令或语句的含义和功能作具 阅读全文
posted @ 2012-04-10 22:11 fly1988happy 阅读(11292) 评论(0) 推荐(2) 编辑
摘要:1.普通数组的定义(维数)const unsigned int buf_size=512, max_files=20;int staff_size=27;const unsigned sz=get_size(); char input_buffer[buf_size];//ok,是const变量string fileTable[max_files+1];//ok,是constant表达式(常量表达式)。double salaries[staff_size];//error,不是const变量。int test_scores[get_size()];//error,不是const表达式。int 阅读全文
posted @ 2012-04-10 15:49 fly1988happy 阅读(2784) 评论(0) 推荐(0) 编辑
摘要:1. 函数stlen原型:extern unsigned int strlen(char *s);在Visual C++ 6.0中,原型为size_t strlen( const char *string );其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t; 头文件:string.h 格式:strlen (字符数组名) 功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内 说明:返回s的长度,不包括结束符NULL。2. stlen与sizeof的区别(1)strle 阅读全文
posted @ 2012-04-06 11:42 fly1988happy 阅读(513) 评论(0) 推荐(0) 编辑
摘要:1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符。如在代码中写"abc",那么编译器帮你存储的是"abc\0"。2. "abc"是常量吗?-----------注意字符串的存储形式答案是有时是、有时不是。 (1)不是常量的情况:"abc"作为字符数组初始值的时候就不是,如: char str[] = "abc"; 因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为:c 阅读全文
posted @ 2012-04-06 10:47 fly1988happy 阅读(2509) 评论(0) 推荐(1) 编辑
摘要:1.map定义map是键-值对的集合。map类型通常可以理解为关联数组:可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。<1>map模板原型:template < class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key,T> > > class map;key:关键值的类型。在map对象中的每个元素是通过该关键值唯一确定元素的。 阅读全文
posted @ 2012-03-06 11:22 fly1988happy 阅读(22875) 评论(0) 推荐(2) 编辑
摘要:1.变量的定义&声明变量的声明有两种情况:<1>一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 <2>另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”。从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。然而对于 extern a 来 阅读全文
posted @ 2012-03-04 14:53 fly1988happy 阅读(9583) 评论(1) 推荐(4) 编辑
摘要:函数的返回主要分为以下几种情况:1、主函数main的返回值:允许主函数main没有返回值就可结束;可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。2、返回非引用类型:函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。在求解表达式的时候,如果需要一个地方存储其运算结果,编译器会创建一个没命名的对象,这就是临时对象。C++程序员通常用temporary这个术语来代替temporary object。用函数返回值初始化临时对象与用实参初始化形参的方法是 阅读全文
posted @ 2011-12-14 10:45 fly1988happy 阅读(57530) 评论(5) 推荐(7) 编辑
摘要:在VC++6.0中的单步调试:调试重要的几个键:F9在当前光标所在的行下断点,如果当前行已经有断点,则取消断点.F5调试状态运行程序,程序执行到有断点的地方会停下来.F10执行下一句话(不进入函数)step outF11执行(进入函数)step inCTRL+F10运行到光标所在行.F11和F10的区别是,如果当前执行语句是函数调用,则会进入函数里面.(问题:按f11调试时出现please enter the path for scanf.c(或printf.c等)?说明在调试到某个用到了scanf的语句时,用了F11而不是F10。F11会逐条语句调试,F10会跳过当前行,而不管这条语句是一个 阅读全文
posted @ 2011-12-09 17:12 fly1988happy 阅读(11325) 评论(0) 推荐(0) 编辑
摘要:程序变量分区中栈和堆的区别(1)申请方式stack: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间。heap: 需要程序员自己申请,并指明大小,在C中malloc函数,C++中是new运算符。如p1 = (char *)malloc(10); p1 = new char[10];如p2 = (char *)malloc(10); p2 = new char[20];但是注意p1、p2本身是在栈中的。(2)申请后系统的响应栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。堆:首先应该知道操作系统有一个记录空闲内存地址的 阅读全文
posted @ 2011-11-17 21:26 fly1988happy 阅读(431) 评论(0) 推荐(0) 编辑
摘要:1、C++编译的程序占用的内存分类(1)栈区(stack):程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。(2)堆区(heap) :在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(3)全局静态区(static):编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。(4)文字常量区 :常量字符 阅读全文
posted @ 2011-11-17 21:17 fly1988happy 阅读(579) 评论(0) 推荐(0) 编辑