《高质量C++编程》学习笔记
Huaerge
这个作者很懒,什么都没留下…
展开
-
有关内存的问题
#include #include #include void GetMemory(char *p) { p = (char *)malloc(100); } void main(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } 以上代码运行结果:程序崩溃 因为 GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NUL原创 2010-06-22 23:03:00 · 1042 阅读 · 0 评论 -
第八章 C++函数的高级特性(8.2 成员函数的重载、覆盖与隐藏)
8.2 成员函数的重载、覆盖与隐藏成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。#include class Base{public:void f(int x){ cout void f(float x){ cout virtual void g(void){ co原创 2010-11-18 10:31:00 · 733 阅读 · 0 评论 -
高质量C++编程之(7.7 杜绝“野指针”)
<br /><br />7.7 杜绝“野指针”<br />“野指针”不是NULL 指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if 语句很容易判断。但是“野指针”是很危险的,if 语句对它不起作用。<br />“野指针”的成因主要有两种:<br />(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL 指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么<br />将指针设置为NULL,要么让它指向合法的内存。<br />例如<br原创 2010-11-18 09:54:00 · 701 阅读 · 0 评论 -
高质量C++编程之(7.5 free 和delete 把指针怎么啦? 7.6动态内存会被自动释放吗?)
<br /><br />7.5 free 和delete 把指针怎么啦?<br /> 别看free 和delete 的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。用调试器跟踪示例7-5,发现指针p 被free 以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p 成了“野指针”。如果此时不把p 设置为NULL,会让人误以为p 是个合法的指针。如果程序比较长,我们有时记不住p 所指的内存是否已经被释放,在继续使用p 之前,通常会用语句if原创 2010-11-18 09:51:00 · 1068 阅读 · 0 评论 -
第八章 C++函数的高级特性(8.3 参数的缺省值 8.4 运算符重载 8.5 函数内联)
<br /><br />8.3 参数的缺省值<br />参数缺省值的使用规则:<br />【规则8-3-1】参数缺省值只能出现在函数的声明中,而不能出现在定义体中。<br />例如:<br />void Foo(int x=0, int y=0); // 正确,缺省值出现在函数的声明中<br />void Foo(int x=0, int y=0) // 错误,缺省值出现在函数的定义体中<br />{<br />⋯<br />}<br /> <br />【规则8-3-2】如果函数有多个参数,参数只能从后向前原创 2010-11-18 10:37:00 · 871 阅读 · 0 评论 -
第八章 C++函数的高级特性(8.1 函数重载的概念)
8.1 函数重载的概念1.如果C++程序要调用已经被编译后的C 函数,该怎么办?void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。例如:extern “C”{void foo(int x, int y);⋯ // 其它函数}或者写成extern “C”{原创 2010-11-18 10:10:00 · 663 阅读 · 0 评论 -
第七章 内存管理(常见内存错误,指针数组的比较)
<br /><br />7.2 常见的内存错误及其对策<br /> 问题1: 内存分配未成功,却使用了它<br /> 解决办法:在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。<br /> 问题2: 内存分配虽然成功,但是尚未初始化就引用它。<br /> 问题3: 内存分配成功并且已经初始化,但操作越过了内原创 2010-11-18 09:44:00 · 635 阅读 · 0 评论 -
第11 章 其它编程经验
<br /><br />11.1 使用const 提高函数的健壮性<br /> 看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的<br />魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。<br />11.1.1 用const 修饰函数的参数<br /> 如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修原创 2010-11-18 10:45:00 · 801 阅读 · 0 评论 -
第10 章 类的继承与组合
<br /><br />10.1 继承<br /> C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承”。我们应当给“继承”立一些使用规则。<br /> <br />【规则10-1-1】如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B继承A 的功能和属性。不要觉得“白吃白不吃”,让一个好端端的健壮青年无缘无<br />故地吃人参补身体。<br />【规则10-1-2】若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的原创 2010-11-18 10:43:00 · 607 阅读 · 0 评论 -
高质量C++编程之(7.10 malloc/free 的使用要点 7.11 new/delete 的使用要点)
<br /><br />7.10 malloc/free 的使用要点<br />函数malloc 的原型如下:<br />void * malloc(size_t size);<br />用malloc 申请一块长度为length 的整数类型的内存,程序如下:<br />int *p = (int *) malloc(sizeof(int) * length);<br />我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。<br />原创 2010-11-18 10:05:00 · 593 阅读 · 0 评论 -
高质量C++编程之(7.8 有了malloc/free 为什么还要new/delete ?7.9 内存耗尽怎么办?)
<br /><br />7.8 有了malloc/free 为什么还要new/delete ?<br /> malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任原创 2010-11-18 09:58:00 · 699 阅读 · 0 评论 -
高质量C++编程之(7.4指针参数是如何传递内存的?)
<br /><br />7.4 指针参数是如何传递内存的?<br /> 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1 中,Test 函数的语句GetMemory(str, 200)并没有使str 获得期望的内存,str 依旧是NULL,<br />为什么?<br />void GetMemory(char *p, int num)<br />{<br />p = (char *)malloc(sizeof(char) * num);<br />}<br />void Test原创 2010-11-18 09:47:00 · 608 阅读 · 0 评论 -
第9 章 类的构造函数、析构函数与赋值函数
<br /><br />9.2 构造函数的初始化表<br />构造函数初始化表的使用规则:<br />原创 2010-11-18 10:41:00 · 589 阅读 · 0 评论 -
类String 的构造函数、析构函数和赋值函数
已知类String 的原型为:class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 private: char *m_data; // 用于保存字符串 };编写String 的上述4原创 2010-06-23 13:21:00 · 541 阅读 · 0 评论 -
Strcpy函数
已知 strcpy 函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中 strDest 是目的字符串,strSrc 是源字符串。 (1)不调用C++/C 的字符串库函数,请编写函数 strcpy原创 2010-06-23 13:16:00 · 548 阅读 · 2 评论