2012年10月30日

C++学习笔记(五):继承及类的初始化

摘要: 成员在基类中为private成员,则只有基类和基类的友元可以访问该成员。成员在基类中为public或protected成员,当(1)public继承时,基类成员保持自己的访问级别(2)protected继承时,基类的public与protected成员在派生类中的访问级别为protected(3)private继承时,基类所有的成员在派生类中的访问级别均为private注意:友元关系不能继承派生类构造函数通过将基类包含在构造函数初始化列表中来间接初始化继承成员例:class D : public B{public: D(int a, int b):B(a),num(b){}/*........ 阅读全文

posted @ 2012-10-30 10:58 Chris-Lin 阅读(225) 评论(0) 推荐(0) 编辑

C++学习笔记(四):虚析构函数

摘要: 先看一下代码,使用的是虚析构函数using namespace std;class Base{ public: virtual ~Base(){ cout << "~Base()" <<endl; }};class D:public Base{ public: ~D(){ cout << "~D()" << endl; }};int main(){ Base *b = new D; delete b; return 0;}执行结果是:~D()~Base()把v... 阅读全文

posted @ 2012-10-30 10:25 Chris-Lin 阅读(119) 评论(0) 推荐(0) 编辑

2012年10月28日

C++学习笔记(三):动态绑定与静态绑定

摘要: 要触发动态绑定,需满足两个条件:(1)只有虚函数才能进行动态绑定,非虚函数不进行动态绑定。(2)必须通过基类类型的引用或指针进行函数调用。基类类型的引用或指针可以引用基类类型对象,也可以引用派生类类型对象。(1)对象的静态类型:对象在声明时采用的类型。是在编译期确定的。(2)对象的动态类型:目前所指对象的类型。是在运行期决定的。简单点说:静态类型是用于声明指针的类型,而动态类型则是指针指向的实际类型。class B{public:virtual void func();};class D : public B{public:virtual void func();};D *p1 = new D 阅读全文

posted @ 2012-10-28 23:51 Chris-Lin 阅读(354) 评论(0) 推荐(0) 编辑

2012年10月27日

C++学习笔记(二):使用const、static类成员的注意事项

摘要: const类成员:(1)conststaticint可以使static数据成员在类定义体内初始化;(2)可以通过将数据成员声明为mutable来实现对该类const对象的该数据成员的更改;(3)初始化const数据成员的唯一机会是在构造函数的初始化列表中,直接在类的定义体中以及在构造函数的定义体中初始化都是不正确的。(4)构造函数不能声明为conststatic类成员:在类的外部定义static成员时,无须重复指定static。static成员独立于该类的任意对象而存在,每个static对象是与类关联的对象,并不与该类的对象相关联。static数据成员:(1)在类的定义范围内是声明,必须在类的 阅读全文

posted @ 2012-10-27 21:21 Chris-Lin 阅读(403) 评论(0) 推荐(0) 编辑

C语言学习笔记(零)

摘要: 不要用return 语句返回指向“栈内存”的指针指针指向的字符串是存放在静态存储区的,不可修改。如:char *p= "hello";中的“hello"存放在静态存储区,而char p[] = "hello";中的”hello“是存放在栈的。语句free(p)能正确地释放内存。如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p 连续操作两次就会导致程序运行错误。 阅读全文

posted @ 2012-10-27 00:34 Chris-Lin 阅读(152) 评论(0) 推荐(0) 编辑

2012年10月22日

C++学习笔记(一):引用与指针的区别

摘要: 相同点:指针指向一块内存,它的内容是所指内存的地址,而引用是某块内存的别名。不同点:(1)引用在使用时可以直接使用,无需解引用(*),指针需要解引用。(2)指针是实体,引用仅是别名。(3)引用只能在定义时被初始化,之后不可修改;而指针可变。(4)引用不能为空,指针可以为空。(5)sizeof(引用)得到的是所引用对象的大小,而sizeof(指针)则是地址的大小。(6)引用在创建的同时需被初始化,指针则可以在任何时候被初始化。(7)不能有NULL引用,指针可以是NULL。例:int i = 5;int &m = i;修改m,既修改i 阅读全文

posted @ 2012-10-22 23:54 Chris-Lin 阅读(153) 评论(0) 推荐(0) 编辑

2012年9月29日

C语言学习笔记(六):《C primer plus》与《C和指针》笔记

摘要: memcpy须确保没有重叠区域,memmove无此规则。restrict可用于指针,表明指针是访问一个数据对象的唯一且初始的方式。例子:intar[10];int*restrictrestar=(int)malloc(10*sizeof(int));int*par=ar;intn;for(n=0;n<10;n++){par[n]+=5;restar[n]+=5;ar[n]*=2;par[n]+=3;restar[n]+=3;}restar是访问它所指向数据块的唯一初始方式,编译器可以用具有同样效果的一条语句来代替包含restar的两个语句:restar[n]+=8;而将两个par语句精简 阅读全文

posted @ 2012-09-29 15:32 Chris-Lin 阅读(409) 评论(0) 推荐(0) 编辑

C语言学习笔记(五):《C语言深度剖析》笔记

摘要: register变量必须是能被cpu寄存器所接受的类型。此变量必须是一个单个的值,并且其长度应小于或等于整形的长度,而且此变量可能不存放在内存中,所以不能用取址运算符“&”来获取register变量的地址。静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern也没法使用。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值也不会被销毁,函数下次使用时仍然能用到这个值。在多重循环中,尽可能把最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。把循环嵌套控制在3层以内(有研究表明,循环嵌套超过3层时,程序员对循 阅读全文

posted @ 2012-09-29 15:27 Chris-Lin 阅读(207) 评论(0) 推荐(0) 编辑

C语言学习笔记(四):Linux下C语言的编译过程

摘要: #include<stdio.h>intmain(){printf(“Hello,world.\n”);return0;}通常我们使用gcc来生成可执行程序,命令为:gcchello.c,默认生成可执行文件a.out其实编译(包括链接)的命令:gcchello.c可分解为如下4个大的步骤:预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking)1.预处理(Preproceessing)预处理的过程主要处理包括以下过程:将所有的#define删除,并且展开所有的宏定义处理所有的条件预编译指令,比如#if#ifdef#elif#e 阅读全文

posted @ 2012-09-29 15:22 Chris-Lin 阅读(314) 评论(0) 推荐(0) 编辑

C语言学习笔记(三):数据对齐

摘要: 数据对齐(在没有#pragmapack宏的情况下):原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。(有#pragmapack宏的情况下):原则1与原则3无效,但GCC下最大还是以四位对齐,超过四 阅读全文

posted @ 2012-09-29 15:15 Chris-Lin 阅读(273) 评论(0) 推荐(0) 编辑

导航