c++ 程序语言设计

16
C++ 程程程程程程 Chapter 6: 程程

Upload: stefano-carton

Post on 14-Mar-2016

62 views

Category:

Documents


5 download

DESCRIPTION

C++ 程序语言设计. Chapter 6: 综合一. C++ 句柄类. C++ 访问控制只针对编译器有效,在内存中则一视同仁。 如何突破访问控制的限制,直接访问类的私有数据成员?. class objClass { public: int i; private: int j; public: int k; }. C++ 句柄类. 隐藏实现 减少重复编译 参见 Handle0.cpp 、 Handle0.h 注意:“ Cheshire* smile; ”,为什么?. C++ 句柄类. 实际示例 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: C++ 程序语言设计

C++ 程序语言设计Chapter 6: 综合一

Page 2: C++ 程序语言设计

C++ 句柄类class objClass{

public:int i;

private:int j;

public:int k;

}

C++ 访问控制只针对编译器有效,在内存中则一视同仁。 如何突破访问控制的限制,直接访问类的私有数据成员?

Page 3: C++ 程序语言设计

C++ 句柄类 隐藏实现 减少重复编译

参见 Handle0.cpp 、 Handle0.h

注意:“ Cheshire* smile;” ,为什么?

Page 4: C++ 程序语言设计

C++ 句柄类 实际示例 尽量隐藏类数据成员,仅提供公共的类成员函数接口。 参见代码,其中:handle.h 是暴露给 client 的唯一接口;handle.cpp 是 handle class 的实现,无须暴露;body.h 和 body.cpp 是 body class 的实现,无须暴露;client.cpp 是 client 的范例。

Page 5: C++ 程序语言设计

C++ 句柄类 编译方法g++ -c handle.cppg++ -c body.cppar rcs libimpl.a handle.o body.o

handle.h 是暴露给 client 的唯一接口,因此client 只要在其文件里包含 handle.h 就可以了。

g++ client.cpp libimpl.a -o client

Page 6: C++ 程序语言设计

Make 以上的编译步骤可以利用配置文件自动完成 批处理文件 .bat make - makefile ant - build.xml

Page 7: C++ 程序语言设计

Make make 的行为target ... : prerequisites ...

command

一句话, prerequisites 中如果有一个以上的文件比 target 文件要新的话, command 所定义的命令就会被执行。

Page 8: C++ 程序语言设计

Make 宏 后缀规则 默认目标参考《跟我一起写 Makefile 》

Page 9: C++ 程序语言设计

利用 Eclipse 和 CDT 编译 C++ Eclipse CDT 插件安装方式 参考文章

Page 10: C++ 程序语言设计

常量 const and #define const 用于定义常量,用 const 定义的常量必须进行初始化,而且初始化必须在定义的地方 对于 const 定义的常量,编译器可以对其进行数据静态类型安全检查 对于 #define 宏定义的常量,编译器只是进行简单的字符替换,没有类型安全检查,且会出错#define N 100#define M 200 + NN * M; //100 * (200 + N) 还是 100 * 200 + N

Page 11: C++ 程序语言设计

常量 const and #define 有些调试程序可对 const 进行调试,但不对

#define 进行调试 当定义局部变量时, const 作用域仅限于定义局部变量的函数体内 用 #define 时其作用域不仅限于定义局部变量的函数体内,而是从定义点到整个程序的结束点 如果想让一个值不变,就应该使之成为 const

Page 12: C++ 程序语言设计

常量 指针与 const

int* const p; //p++; // 修改 p 本身, Error //*p = 2; //OK

const int* p; //p++;//OK // *p = 2; //Error

const int* const p;// 指针 p 本身是不能被修改并且 p 所有有效的内容也不能被 修改 *p = 2; Error 和 p++; Error int const* p; ???

Page 13: C++ 程序语言设计

常量 const 与类型检查

可以把一个非 const 对象赋给一个指向 const的指针,因为有时候我们不想从这个指针来修改其对象的值; 不可以把一个 const 对象赋值给一个非 const指针,因为这样可能会通过这个指针改变指向对象的值 使用类型强制转换可以通过指针改变 const 对象const int r=100;int * ptr = const_cast<int*>(&r);

Page 14: C++ 程序语言设计

常量 const 与函数参数及返回类型

值传递时不需要加 const 修饰 指针传递时,加 const 修饰可防止意外修改指针指向的内存单元,起到保护作用 当输入参数为用户自定义类型或抽象数据类型时,应该将“值传递”改为“ const & 传递”,目的可以提高效率 const 修饰函数返回类型用法类似,仅仅修饰的对象变成一个返回对象

Page 15: C++ 程序语言设计

常量 const 类成员和 const 成员函数

const 类成员在构造期间会允许被初始化并且在以后不能被改变。 const 成员函数的描述:< 返回类型说明符 > < 函数名> (< 参数列表>) const; 如果一个成员函数不会修改数据成员,那么最好将其声明为 const ,因为 const 成员函数中不允许对数据成员进行修改,这大大提高了程序的健壮性

Page 16: C++ 程序语言设计

常量 const记忆法则

const 修饰后面一个最近的名称 const int I 、 int* const I; 、 const int* p;

对于所有非 const 类型可以无条件转化为 const 类型,但是后者不能自动转化为前者除非显式的强制转化去掉 const

在 const 类成员函数处理时,引入了mutable 修饰类成员变量,经过其修饰的成员变量可以在 const 类成员函数中被修改