分类: C/C++
2011-06-07 08:50:52
C++有一些小细节已经不太清晰了。抽时间复习下,不管怎样基础还真的永远是最重要的啊。
第一章 C++ 概述 开始
C++程序源文件名字
一般C++程序源文件有头文件、C++程序文件。标准C++头文件没有后缀,而且C++程序文件也因不同C++产品实现有所不同。一般为 .h和.cpp后缀,具体应查看相应平台编译器用户指南确定后缀名。
关于名字空间
C++标准库中的名字都是在一个称作std 的名字空间中声明的,这些名字在我们的程序文本文件中是不可见的。除非我们显式地使它们可见,using 指示符告诉编译器要使用在名字空间std 中声明的名字。(std是标准库名字空间的名称)
预处理器指示符
预处理器指示符以#起始做标识,处理这些指示符的程序叫做预处理器(通常捆绑在编译器中)。
#include 指示符,它有两种格式,如:
#include
#include “some1.h” 表明该文件是用户提供文件,查找该文件从当前目录开始。(symbian中也是需要把目录加入到mmp中,否则编译时找不到头文件)
被包含的文件中还可以含有#include指示符,由于嵌套包含的原因,一些头文件很可能会被多次包含到一个源文件中。一般编写头文件时,做如下防止头文件重复包含:
#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/* Bookstore.h 的内容*/
#endif#define 为宏定义
#if 、#else、#endif 、#ifdef 、#ifndef等分别为不同意义的条件编译这里不多做介绍。
编译器在编译不同程序(如C或C++),或者不同平台不同编译器在编译程序时都会预定义一些宏,这样我们可以根据这些宏定义与否区分不同的程序,不同的编译平台。
第二章 C++ 浏览
内置数组类型
数组长度信息为预先定义,内置数组本身没有记录其长度,因此需要额外记录这些信息。当然也可以通过数组长度/单个数组元素长度算得长度。
动态内存分配和指针
静态分配——即编译器在处理程序源代码时分配 如:int p = 1024;
动态分配——即程序执行时调用运行时刻库函数来分配 如:int* p = new int(1024);
静态与动态内存分配的两个主要区别是
1.静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有名字的变量,我们通过指针间接地对它进行操作。
2.静态对象的分配与释放由编译器自动处理。程序员需要理解这一点,但不需要做任何事情。相反,动态对象的分配与释放,必须由程序员显式地管理,相对来说比较容易出错,它通过new 和delete两个表达式来完成。
对类数据做封装的好处
1 如果类的私有实现代码需要修改或扩展,那么只有相对很小一部分要求访问这些实现代码的成员函数需要修改,而许多使用该类的用户程序无需修改但是要求重新编译。
2 如果类的私有实现代码有错误,那么通常需要检查的代码数量只局限在相对较少的,需要访问这些实现代码的成员函数上,而无需检查整个程序。
由于C++不允许成员函数与数据成员共享同一个名字,所以在这样的情况下一般的习惯是在数据成员名字前面加一个下划线_。
一些简单值返回的函数应尽量使用内联函数。如类定义中做如下函数:
int size() const { return m_size; }
由内联函数特点可知,程序编译时,任务对obj.size()的调用都会被展开成obj.m_size,因为普通函数调用开销比obj.m_size这种直接访问内存的操作大的多。(函数调用的时候有临时变量,和程序调用栈等信息需保存)