1 / 16

C++ 程序语言设计

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

Download Presentation

C++ 程序语言设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. C++句柄类 • C++访问控制只针对编译器有效,在内存中则一视同仁。 • 如何突破访问控制的限制,直接访问类的私有数据成员? class objClass { public: int i; private: int j; public: int k; }

  3. C++句柄类 • 隐藏实现 • 减少重复编译 参见Handle0.cpp、Handle0.h 注意:“Cheshire* smile;”,为什么?

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

  5. 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

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

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

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

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

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

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

  12. 常量 • 指针与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; ???

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

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

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

  16. 常量 • const记忆法则 • const修饰后面一个最近的名称 • const int I、int* const I;、const int* p; • 对于所有非const 类型可以无条件转化为 const类型,但是后者不能自动转化为前者除非显式的强制转化去掉const • 在const类成员函数处理时,引入了mutable修饰类成员变量,经过其修饰的成员变量可以在const类成员函数中被修改

More Related