关于构造函数、析构函数,高手进,求分析。。。。。

brk1985 2010-11-16 12:53:40



#include <iostream>

struct Base {
Base() {}
virtual ~Base()
{
std::cout << "Base destroyed" << std::endl;
}
};

struct Derived : Base {
~Derived() {
std::cout << "Derived destroyed" << std::endl;
}
};

int main() {
Base *b = new Derived();delete b;//输出结果:Derived destroyed、Base destroyed;
//const Base &b1 = Derived();//基类析构函数不设为虚函数,输出结果:Derived destroyed、Base destroyed、Derived destroyed、Base destroyed;
//const Base &b1 = Derived();//基类析构函数设为虚函数,输出结果:Derived destroyed、Base destroyed;
//Derived();//输出结果:Derived destroyed、Base destroyed,为什么会调用基类析构函数?
//Base b2 = Derived();//输出结果:Derived destroyed、Base destroyed、Base destroyed;
return 0;
}



1. Base *b = new Derived();delete b;没有什么问题,最基本的,好理解;
2. const Base &b1 = Derived();基类的析构函数virtual去掉,输出4条语句?很意外,为什么不是两条?还有不解的是为什么构造函数可以作为右值赋值给类对象(构造函数不是没有返回类型吗?)?
3. const Base &b1 = Derived();基类的析构函数virtual加上,输出2条语句,不知道与2区别在哪里?
4. Derived();为什么会调用基类析构函数?
5. Base b2 = Derived();为什么输出3条语句?
...全文
272 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
brk1985 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 jikeyuan1 的回复:]

在继承层次中析构函数一定要定义为虚函数 ,运行时多态,不然Base *b;b= new Derived();这条语句只会调用基类的析构函数,而造成内存的泄露,因为你b是基类指针,没有virtual的话,基类指针是只能见到自己类中的函数,对于派生类中的成员是见不到的,所以不可能调用子类的析构函数,还有LZ说什么会出现四条结果,那是不可能的 LZ的编译器可以换掉啦
[/Quote]

原程序有这么一段的。。。就上面程序都是2条,这个又牵涉到宏定义了。。。呵呵,结贴。。。
#if defined CONSTRUCTOR_DEFINED
Base() {}
#endif
jikeyuan1 2010-11-16
  • 打赏
  • 举报
回复
在继承层次中析构函数一定要定义为虚函数 ,运行时多态,不然Base *b;b= new Derived();这条语句只会调用基类的析构函数,而造成内存的泄露,因为你b是基类指针,没有virtual的话,基类指针是只能见到自己类中的函数,对于派生类中的成员是见不到的,所以不可能调用子类的析构函数,还有LZ说什么会出现四条结果,那是不可能的 LZ的编译器可以换掉啦
龙哥依旧 2010-11-16
  • 打赏
  • 举报
回复
把这帖子结了吧
把没懂的地方再发个新帖!
job82824 2010-11-16
  • 打赏
  • 举报
回复
你要是用过MFC就会发现,里面所有自定义的类和派生类的析构函数都自动会在前面添加上virtual声明的。就算你去掉这个,编译器也是添加了的。就在tooltips里面有显示的。

所以 呵呵...
brk1985 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 qq120848369 的回复:]

谁会用const Base& a=Derived();
[/Quote]

变态试题吧。。。
这语句意思是:把派生类临时对象转换成基类对象,并被a引用?不知道我有没有理解错误?
qq120848369 2010-11-16
  • 打赏
  • 举报
回复
谁会用const Base& a=Derived();
brk1985 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 brk1985 的回复:]

引用 2 楼 ddlddy 的回复:

2.你的virtual不加的话Base *b = new Derived();delete b;基类不会析构const Base &amp;b1 = Derived();这个没影响,“=”是类的赋值函数,如果没有定义会有默认的,属于操作符重载。
3.没有区别Base *b = new Derived();delete b;这个时候能看出来区别……
[/Quote]

22楼纠正下,得出的结论是在基类指针指向派生类对象的时候,加virtual语句起到的作用是调用派生类析构函数。。。
brk1985 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ddlddy 的回复:]

引用 1 楼 gules 的回复:
Derived()将产生一个派生类的临时对象,且派生类析构函数会自动调用其基类的析构函数。

派生类析构函数会自动调用其基类的析构函数?
[/Quote]

发现确实这样,第4点疑问解决。。。
brk1985 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ddlddy 的回复:]

2.你的virtual不加的话Base *b = new Derived();delete b;基类不会析构const Base &b1 = Derived();这个没影响,“=”是类的赋值函数,如果没有定义会有默认的,属于操作符重载。
3.没有区别Base *b = new Derived();delete b;这个时候能看出来区别
4.自动调用的。
5.有临时对象。
[/Quote]

我的意思是第二点(不加virtual)与第三点(加virtual)疑问区别在哪里?为什么加了virtual,输出4条语句,不加才输出2条,我不明白为什么?

加virtual的作用,很明显,Base *b = new Derived();delete b;这2条语句也调用了派生类的析构函数,否则只调用基类的析构函数,所以出问题。。。得出的结论是在基类指针指向派生类对象的时候,加virtual语句起到的作用是调用派生类对象。。。

但是为什么const Base &b1 = Derived();这条语句,加与不加virtual,也会不同?一般书里提到虚析构函数,只谈到上面这点结论,没提到引用这种情况。。。
龙哥依旧 2010-11-16
  • 打赏
  • 举报
回复
brk1985
可以结贴了!
liutengfeigo 2010-11-16
  • 打赏
  • 举报
回复
Base b2 = Derived();
这算不算是子类的对象转化父类对象呢?
一个临时D用它的一部份B去复制构造b2而已
gules 2010-11-16
  • 打赏
  • 举报
回复
当子类的对象转化父类对象时,会发生“切割”(除非是对象的引用或指针),什么虚不虚的都没用!
龙哥依旧 2010-11-16
  • 打赏
  • 举报
回复
引用百度的搜索
当子类的对象转化父类对象时,如果析构函数不是虚函数,则会执行父类的析构函数。则可能造成该对象(主要是子类对象特有的资源)不能被释放,造成资源泄漏。
那么
Base b2 = Derived();
这算不算是子类的对象转化父类对象呢?
liutengfeigo 2010-11-16
  • 打赏
  • 举报
回复
难道楼主还不知道复制构造函数和赋值操作符在这里是很麻烦的?
龙哥依旧 2010-11-16
  • 打赏
  • 举报
回复
gules 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ddlddy 的回复:]
猜想一下,如果没加Base::~Base();派生类调用基类的析构,那么添加后,会重复调用吗?
[/Quote]

别猜了,自己试试吧!(提示:注意编译器)
龙哥依旧 2010-11-16
  • 打赏
  • 举报
回复
猜想一下,如果没加Base::~Base();派生类调用基类的析构,那么添加后,会重复调用吗?
liutengfeigo 2010-11-16
  • 打赏
  • 举报
回复
一切都是对的。
只是你没理解好而已。
gules 2010-11-16
  • 打赏
  • 举报
回复
自己运行看看就知道了。
liutengfeigo 2010-11-16
  • 打赏
  • 举报
回复
因为有了virtual
加载更多回复(9)
《高质量C++编程指南》 软件质量是被大多数程序员挂在嘴上而不是放在心上的东西! 除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前捏造的C++/C程序怎么会有那么多的毛病?” 别难过,作者只不过比你早几年、多几次惊慌而已。 请花一两个小时认真阅读这本百页经书,你将会获益匪浅,这是前面N-1个读者的建议。 首先请做附录B的C++/C试题(不要看答案),考查自己的编程质量究竟如何。然后参照答案严格打分。 (1)如果你只得了几十分,请不要声张,也不要太难过。编程质量差往往是由于不良习惯造成的,与人的智力、能力没有多大关系,还是有药可救的。成绩越差,可以步的空间就越大,中国不就是在落后中赶超发达资本主义国家吗?只要你能下决心改掉不良的编程习惯,第二次考试就能及格了。 (2)如果你考及格了,表明你的技术基础不错,希望你能虚心学习、不断步。如果你还没有找到合适的工作单位,不妨到上海贝尔试一试。 (3)如果你考出85分以上的好成绩,你有义务和资格为你所在的团队作“C++/C编程”培训。希望你能和我们多多交流、相互促。半年前我曾经发现一颗好苗子,就把他挖到我们小组来。 (4)如果你在没有任何提示的情况下考了满分,希望你能收我做你的徒弟。 前 言 5 第1章 文件结 10 1.1 版权和版本的声明 10 1.2 头文件的结 11 1.3 定义文件的结 12 1.4 头文件的作用 12 1.5 目录结 13 第2章 程序的版式 14 2.1 空行 14 2.2 代码行 15 2.3 代码行内的空格 16 2.4 对齐 17 2.5 长行拆分 18 2.6 修饰符的位置 18 2.7 注释 19 2.8 类的版式 20 第3章 命名规则 21 3.1 共性规则 21 3.2 简单的WINDOWS应用程序命名规则 22 3.3 简单的UNIX应用程序命名规则 24 第4章 表达式和基本语句 25 4.1 运算符的优先级 25 4.2 复合表达式 26 4.3 IF 语句 26 4.4 循环语句的效率 28 4.5 FOR 语句的循环控制变量 29 4.6 SWITCH语句 29 4.7 GOTO语句 30 第5章 常量 32 5.1 为什么需要常量 32 5.2 CONST 与 #DEFINE的比较 32 5.3 常量定义规则 32 5.4 类中的常量 33 第6章 函数设计 35 6.1 参数的规则 35 6.2 返回值的规则 36 6.3 函数内部实现的规则 38 6.4 其它建议 39 6.5 使用断言 40 6.6 引用与指针的比较 41 第7章 内存管理 43 7.1内存分配方式 43 7.2常见的内存错误及其对策 43 7.3指针与数组的对比 44 7.4指针参数是如何传递内存的? 46 7.5 FREE和DELETE把指针怎么啦? 49 7.6 动态内存会被自动释放吗? 49 7.7 杜绝“野指针” 50 7.8 有了MALLOC/FREE为什么还要NEW/DELETE ? 51 7.9 内存耗尽怎么办? 52 7.10 MALLOC/FREE 的使用要点 53 7.11 NEW/DELETE 的使用要点 54 7.12 一些心得体会 55 第8章 C++函数的高级特性 56 8.1 函数重载的概念 56 8.2 成员函数的重载、覆盖与隐藏 59 8.3 参数的缺省值 62 8.4 运算符重载 63 8.5 函数内联 64 8.6 一些心得体会 67 第9章 类的函数函数与赋值函数 68 9.1 函数函数的起源 68 9.2 函数的初始化表 69 9.3 的次序 71 9.4 示例:类STRING的函数函数 71 9.5 不要轻视拷贝函数与赋值函数 72 9.6 示例:类STRING的拷贝函数与赋值函数 72 9.7 偷懒的办法处理拷贝函数与赋值函数 74 9.8 如何在派生类中实现类的基本函数 74 9.9 一些心得体会 76 第10章 类的继承与组合 77 10.1 继承 77 10.2 组合 79 第11章 其它编程经验 81 11.1 使用CONST提高函数的健壮性 81 11.2 提高程序的效率 83 11.3 一些有益的建议 84 参考文献 86 附录A :C++/C代码审查表 87 附录B :C++/C试题 92 附录C :C++/C试题的答案与评分标准 96
目 录 译者序 前言 第1章 对象的演化 1 1.1 基本概念 1 1.1.1 对象:特性+行为 1 1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3 1.2.1 较好的C 3 1.2.2 采用渐的学习方式 4 1.2.3 运行效率 4 1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺什么 10 1.3.6 方法应当提供什么 10 1.4 起草:最小的方法 12 1.4.1 前提 13 1.4.2 高概念 14 1.4.3 论述(treatment) 14 1.4.4 结化 14 1.4.5 开发 16 1.4.6 重写 17 1.4.7 逻辑 17 1.5 其他方法 17 1.5.1 Booch 18 1.5.2 责任驱动的设计(RDD) 19 1.5.3 对象建模技术(OMT) 19 1.6 为向OOP转变而采取的策略 19 1.6.1 逐步入OOP 19 1.6.2 管理障碍 20 1.7 小结 21 第2章 数据抽象 22 2.1 声明与定义 22 2.2 一个袖珍C库 23 2.3 放在一起:项目创建工具 29 2.4 什么是非正常 29 2.5 基本对象 30 2.6 什么是对象 34 2.7 抽象数据类型 35 2.8 对象细节 35 2.9 头文件形式 36 2.10 嵌套结 37 2.11 小结 41 2.12 练习 41 第3章 隐藏实现 42 3.1 设置限制 42 3.2 C++的存取控制 42 3.3 友元 44 3.3.1 嵌套友元 45 3.3.2 它是纯的吗 48 3.4 对象布局 48 3.5 类 48 3.5.1 用存取控制来修改stash 50 3.5.2 用存取控制来修改stack 51 3.6 句柄类(handle classes) 51 3.6.1 可见的实现部分 51 3.6.2 减少重复编译 52 3.7 小结 54 3.8 练习 54 第4章 初始化与清除 55 4.1 用函数确保初始化 55 4.2 用函数确保清除 56 4.3 清除定义块 58 4.3.1 for循环 59 4.3.2 空间分配 60 4.4 含有函数函数的stash 61 4.5 含有函数函数的stack 63 4.6 集合初始化 65 4.7 缺省函数 67 4.8 小结 68 4.9 练习 68 第5章 函数重载与缺省参数 69 5.1 范围分解 69 5.1.1 用返回值重载 70 5.1.2 安全类型连接 70 5.2 重载的例子 71 5.3 缺省参数 74 5.4 小结 81 5.5 练习 82 第6章 输入输出流介绍 83 6.1 为什么要用输入输出流 83 6.2 解决输入输出流问题 86 6.2.1 预先了解操作符重载 86 6.2.2 插入符与提取符 87 6.2.3 通常用法 88 6.2.4 面向行的输入 90 6.3 文件输入输出流 91 6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 6.9 建立操纵算子 108 6.10 输入输出流实例 111 6.10.1 代码生成 111 6.10.2 一个简单的数据记录 117 6.11 小结 123 6.12 练习 123 第7章 常量 124 7.1 值替代 124 7.1.1 头文件里的const 124 7.1.2 const的安全性 125 7.1.3 集合 126 7.1.4 与C语言的区别 126 7.2 指针 127 7.2.1 指向const的指针 127 7.2.2 const指针 127 7.2.3 赋值和类型检查 128 7.3 函数参数和返回值 128 7.3.1 传递const值 128 7.3.2 返回const值 129 7.3.3 传递和返回地址 131 7.4 类 133 7.4.1 类里的const和enum 133 7.4.2 编译期间类里的常量 134 7.4.3 const对象和成员函数 136 7.4.4 只读存储能力 139 7.5 可变的(volatile) 140 7.6 小结 141 7.7 练习 141 第8章 内联函数 142 8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在函数函数里隐藏行为 151 8.4 减少混乱 152 8.5 预处理器的特点 153 8.6 改的错误检查 154 8.7 小结 155 8.8 练习 155 第9章 命名控制 157 9.1 来自C语言中的静态成员 157 9.1.1 函数内部的静态变量 157 9.1.2 控制连接 160 9.1.3 其他的存储类型指定符 161 9.2 名字空间 161 9.2.1 产生一个名字空间 162 9.2.2 使用名字空间 163 9.3 C++中的静态成员 166 9.3.1 定义静态数据成员的存储 166 9.3.2 嵌套类和局部类 168 9.3.3 静态成员函数 169 9.4 静态初始化的依赖因素 171 9.5 转换连接指定 174 9.6 小结 174 9.7 练习 174 第10章 引用和拷贝函数 176 10.1 C++中的指针 176 10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝函数 182 10.3.3 缺省拷贝函数 187 10.3.4 拷贝函数方法的选择 188 10.4 指向成员的指针
前 言 6 第1章 文件结 11 1.1 版权和版本的声明 11 1.2 头文件的结 12 1.3 定义文件的结 13 1.4 头文件的作用 13 1.5 目录结 14 第2章 程序的版式 15 2.1 空行 15 2.2 代码行 16 2.3 代码行内的空格 17 2.4 对齐 18 2.5 长行拆分 19 2.6 修饰符的位置 19 2.7 注释 20 2.8 类的版式 21 第3章 命名规则 22 3.1 共性规则 22 3.2 简单的WINDOWS应用程序命名规则 23 3.3 简单的UNIX应用程序命名规则 25 第4章 表达式和基本语句 26 4.1 运算符的优先级 26 4.2 复合表达式 27 4.3 IF 语句 27 4.4 循环语句的效率 29 4.5 FOR 语句的循环控制变量 30 4.6 SWITCH语句 30 4.7 GOTO语句 31 第5章 常量 33 5.1 为什么需要常量 33 5.2 CONST 与 #DEFINE的比较 33 5.3 常量定义规则 33 5.4 类中的常量 34 第6章 函数设计 36 6.1 参数的规则 36 6.2 返回值的规则 37 6.3 函数内部实现的规则 39 6.4 其它建议 40 6.5 使用断言 41 6.6 引用与指针的比较 42 第7章 内存管理 44 7.1内存分配方式 44 7.2常见的内存错误及其对策 44 7.3指针与数组的对比 45 7.4指针参数是如何传递内存的? 47 7.5 FREE和DELETE把指针怎么啦? 50 7.6 动态内存会被自动释放吗? 50 7.7 杜绝“野指针” 51 7.8 有了MALLOC/FREE为什么还要NEW/DELETE ? 52 7.9 内存耗尽怎么办? 53 7.10 MALLOC/FREE 的使用要点 54 7.11 NEW/DELETE 的使用要点 55 7.12 一些心得体会 56 第8章 C++函数的高级特性 57 8.1 函数重载的概念 57 8.2 成员函数的重载、覆盖与隐藏 60 8.3 参数的缺省值 63 8.4 运算符重载 64 8.5 函数内联 65 8.6 一些心得体会 68 第9章 类的函数函数与赋值函数 69 9.1 函数函数的起源 69 9.2 函数的初始化表 70 9.3 的次序 72 9.4 示例:类STRING的函数函数 72 9.5 不要轻视拷贝函数与赋值函数 73 9.6 示例:类STRING的拷贝函数与赋值函数 73 9.7 偷懒的办法处理拷贝函数与赋值函数 75 9.8 如何在派生类中实现类的基本函数 75 9.9 一些心得体会 77 第10章 类的继承与组合 78 10.1 继承 78 10.2 组合 80 第11章 其它编程经验 82 11.1 使用CONST提高函数的健壮性 82 11.2 提高程序的效率 84 11.3 一些有益的建议 85 参考文献 87 附录A :C++/C代码审查表 88 附录B :C++/C试题 93 附录C :C++/C试题的答案与评分标准 97 前 言 软件质量是被大多数程序员挂在嘴上而不是放在心上的东西! 除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前捏造的C++/C程序怎么会有那么多的毛病?” 别难过,作者只不过比你早几年、多几次惊慌而已。 请花一两个小时认真阅读这本百页经书,你将会获益匪浅,这是前面N-1个读者的建议。 一、编程老手与高手的误区 自从计算机问世以来,程序设计就成了令人羡慕的职业,程序员在受人宠爱之后容易发展成为毛病特多却常能自我臭美的群体。 如今在Internet上流传的“真正”的程序员据说是这样的: (1) 真正的程序员没有度表,只有讨好领导的马屁精才有度表,真正的程序员会让领导提心吊胆。 (2) 真正的程序员不写使用说明书,用户应当自己去猜想程序的功能。 (3) 真正的程序员几乎不写代码的注释,如果注释很难写,它理所当然也很难读。 (4) 真正的程序员不画流程图,原始人和文盲才会干这事。 (5) 真正的程序员不看参考手册,新手和胆小鬼才会看。 (6) 真正的程序员不写文档也不需要文档,只有看不懂程序的笨蛋才用文档。 (7) 真正的程序员认为自己比用户更明白用户需要什么。 (8) 真正的程序员不接受团队开发的理念,除非他自己是头头。 (9) 真正的程序员的程序不会在第一次就正确运行,但是他们愿意守着机器行若干个30小时的调试改错。 (10) 真正的程序员不会在上午9:00到下午5:00之间工作,如果你看到他在上午9:00工作,这表明他从昨晚一直干到现在。 …… 具备上述特征越多,越显得水平高,资格老。所以别奇怪,程序员的很多缺点竟然可以被当作优点来欣赏。就象在武侠小说中,那些独来独往、不受约束且带点邪气的高手最令人崇拜。我曾经也这样信奉,并且希望自己成为那样的“真正”的程序员,结果没有得到好下场。
PHP 5首席设计师Andi Gutmans,PEAR创始人Stig Saether Bakken,PHP核心贡献者Derick Rethans三大高手合力而作:本书几乎囊括了PHP 5所有的新特性,包括PHP 5所有的新功能,PHP 5的面向对象编程方法和设计模式,以及PHP 5的新的数据库连接处理、错误处理和XML处理等机制。另外,该书还重点介绍PEAR的基本安装和使用、核心PEAR包介绍和如何创建PEAR组件,可以提供极大帮助那些缺少PEAR使用经验的PHP程序员。 近年来,随着使用PHP的大流量网站逐渐增加,企业在使用:PHP的时候开始面临新的问题,代码的规范与维护就是其中比较突出的问题。另外,在PHP的速度满足业务需后,人们对项目的稳健性、可升级性提出了新的要。 本书为大家全面介绍了PHP 5中的新功能、面向对象编程方法及设计模式,还分阐述了PHP 5中新的数据库连接处理、错误处理和XML处理等机制。希望能够帮助读者系统了解、熟练掌握PHP,最大程度地挖掘PHP的潜力,以更低的成本搭建更加稳健、高效的PHP应用。 本书适合PHP程序员及具备其他高级语言编程经验的Web开发人员阅读。 目录: 序 前言 第1章 PHP 5新特性 1.1 介绍 1.2 语言特性 1.3 PHP改概述 1.4 其他的PHF 5新特性 1.5 总结 第2章 PHP 5基础语言 2.1 介绍 2.2 嵌入HTMI 2.3 注释 2.4 变量 2.5 基础数据类型 2.6 运算符 2.7 控制结 2.8 函数 2.9 总结 第3章 PHP 5面向对象语言 3.1 介绍 3.2 对象 3.3 声明一个类 3.4 new关键字和函数 3.5 函数 3.6 使用$this变量访问方法和属性 3.7 类的常量 3.8 克隆对象 3.9 多态 3.10 parent::和self:: 3.11 instanceof运算符 3.12 Abstract方法和类 3.13 接口 3.14 接口的继承 3.15 final方法 3.16 final 类 3.17 __toString()方法 3.18 异常处理 3.19 ___autoloadO 3.20 在函数参数中提示类的类别 3.21 总结 第4章 PHP 5高级面向对象编程和设计模式 4.1 介绍 4.2 重载性能 4.3 迭代器 4.4 设计模式 4.5 映射 4.6 总结 第5章 如何用PHP写一个Web应用 5.1 介绍 5.2 嵌入HTML当中 5.3 获取用户数据 5.4 对用户输入的数据行安全验证 5.5 一些让脚本运行“安全”的技术 5.6 Cookies 5.7 Sessions 5.8 文件上传 5.9 架 5.10 总结 第2章 PHP 5基础语言 第3章 PHP 5面向对象语言 第4章 PHP 5高级面向对象编程和设计模式 第5章 如何用PHP写一个Web应用 第6章 使用PHP 5访问数据库 第7章 错误处理 第8章 PHP 5中处理XML 第9章 主流扩展 第10章 使用PEAR 第11章 重要的PEAR包 第12章 创建PEAR的组件 第13章 迁移 第14章 性能 第15章 一个编写PHP扩展的介绍 第16章 PHP Shell 脚本编程 附录A PEAR和PECL包索引 附录B phpDocumentor格式参考 附录C Zend Studio快速使用说明 索引 “这本书,是我的同事Andi Gutmans和另外两位非常卓越的PHP开发者Stig Bakken及Derick Rethans编写的,它描述了许多PHP 5丰富功能的关键内容。本书彻底阐述了新版本所有的特性,并且是所有想研究PHP 5高级特性的PHP开发者的必备书。”             ——Zeev Su raski,PHP 5设计者之一、Zend引擎创始人之一 “本书英文版刚刚上市,就在国外快速流行起来。我记得此书出版不久,Andi就告诉我这本书的下载次数超过了百万。更多的书都是依据PHP 4来撰写的,真正意义上的PHP 5书籍市场上并不太多,此书正是完全意义上的第一本PHP 5技术书。”               ——耿志军,PHPChina创始人

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧