160 likes | 328 Views
C++ 程序语言设计. Chapter 6: 综合一. C++ 句柄类. C++ 访问控制只针对编译器有效,在内存中则一视同仁。 如何突破访问控制的限制,直接访问类的私有数据成员?. class objClass { public: int i; private: int j; public: int k; }. C++ 句柄类. 隐藏实现 减少重复编译 参见 Handle0.cpp 、 Handle0.h 注意:“ Cheshire* smile; ”,为什么?. C++ 句柄类. 实际示例
E N D
C++程序语言设计 Chapter 6: 综合一
C++句柄类 • C++访问控制只针对编译器有效,在内存中则一视同仁。 • 如何突破访问控制的限制,直接访问类的私有数据成员? class objClass { public: int i; private: int j; public: int k; }
C++句柄类 • 隐藏实现 • 减少重复编译 参见Handle0.cpp、Handle0.h 注意:“Cheshire* smile;”,为什么?
C++句柄类 • 实际示例 尽量隐藏类数据成员,仅提供公共的类成员函数接口。 参见代码,其中: handle.h是暴露给client的唯一接口; handle.cpp是handle class的实现,无须暴露; body.h和body.cpp是body class的实现,无须暴露; client.cpp是client的范例。
C++句柄类 • 编译方法 g++ -c handle.cpp g++ -c body.cpp ar rcs libimpl.a handle.o body.o handle.h是暴露给client的唯一接口,因此client只要在其文件里包含handle.h就可以了。 g++ client.cpp libimpl.a -o client
Make • 以上的编译步骤可以利用配置文件自动完成 • 批处理文件.bat • make-makefile • ant-build.xml
Make • make的行为 target ... : prerequisites ... command 一句话,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。
Make • 宏 • 后缀规则 • 默认目标 参考《跟我一起写Makefile》
利用Eclipse和CDT编译C++ • Eclipse • CDT • 插件安装方式 • 参考文章
常量 • constand #define • const用于定义常量,用const定义的常量必须进行初始化,而且初始化必须在定义的地方 • 对于const定义的常量,编译器可以对其进行数据静态类型安全检查 • 对于#define宏定义的常量,编译器只是进行简单的字符替换,没有类型安全检查,且会出错 #define N 100 #define M 200 + N N * M; //100 * (200 + N)还是100 * 200 + N
常量 • constand #define • 有些调试程序可对const进行调试,但不对#define进行调试 • 当定义局部变量时,const作用域仅限于定义局部变量的函数体内 • 用#define时其作用域不仅限于定义局部变量的函数体内,而是从定义点到整个程序的结束点 • 如果想让一个值不变,就应该使之成为const
常量 • 指针与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; ???
常量 • const与类型检查 • 可以把一个非const对象赋给一个指向const的指针,因为有时候我们不想从这个指针来修改其对象的值; • 不可以把一个const对象赋值给一个非const指针,因为这样可能会通过这个指针改变指向对象的值 • 使用类型强制转换可以通过指针改变const对象 const int r=100; int * ptr = const_cast<int*>(&r);
常量 • const与函数参数及返回类型 • 值传递时不需要加const修饰 • 指针传递时,加const修饰可防止意外修改指针指向的内存单元,起到保护作用 • 当输入参数为用户自定义类型或抽象数据类型时,应该将“值传递”改为“const &传递”,目的可以提高效率 • const修饰函数返回类型用法类似,仅仅修饰的对象变成一个返回对象
常量 • const类成员和const成员函数 • const类成员在构造期间会允许被初始化并且在以后不能被改变。 • const成员函数的描述: <返回类型说明符> <函数名> (<参数列表>) const; • 如果一个成员函数不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,这大大提高了程序的健壮性
常量 • const记忆法则 • const修饰后面一个最近的名称 • const int I、int* const I;、const int* p; • 对于所有非const 类型可以无条件转化为 const类型,但是后者不能自动转化为前者除非显式的强制转化去掉const • 在const类成员函数处理时,引入了mutable修饰类成员变量,经过其修饰的成员变量可以在const类成员函数中被修改