Welcome 微信登录

首页 / 软件开发 / C++

高质量C++/C编程指南-第6章-函数设计(1)

高质量C++/C编程指南-第6章-函数设计(1)

高质量C++/C编程指南-第6章-函数设计(1)2007-05-06林锐函数是C++/C程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的。本章重点论述函数的接口设计和内部实现的一些规则。 函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer)。C++ 语言中多了引用传递(pass by re...
高质量C++/C编程指南-第6章-函数设计(2)

高质量C++/C编程指南-第6章-函数设计(2)

高质量C++/C编程指南-第6章-函数设计(2)2007-05-06林锐由于c是char类型,取值范围是[-128,127],如果宏EOF的值在char的取值范围之外,那么if语句将总是失败,这种“危险”人们一般哪里料得到!导致本例错误的责任并不在用户,是函数getchar误导了使用者。l 【规则6-2-3】不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。回顾上例,C标准库函数的设计者为什...
高质量C++/C编程指南-第6章-函数设计(3)

高质量C++/C编程指南-第6章-函数设计(3)

高质量C++/C编程指南-第6章-函数设计(3)2007-05-06林锐对于相加函数,应当用“值传递”的方式返回String对象。如果改用“引用传递”,那么函数返回值是一个指向局部对象temp的“引用”。由于temp在函数结束时被自动销毁,将导致返回的“引用”无效。例如:c = a + b; 此时 a + b 并不返回期望值,c什么也得不到,流下了隐患。6.3 ...
高质量C++/C编程指南-第7章-内存管理(1)

高质量C++/C编程指南-第7章-内存管理(1)

高质量C++/C编程指南-第7章-内存管理(1)2007-05-06林锐欢迎进入内存这片雷区。伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本章的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。7.1...
高质量C++/C编程指南-第7章-内存管理(2)

高质量C++/C编程指南-第7章-内存管理(2)

高质量C++/C编程指南-第7章-内存管理(2)2007-05-06林锐7.3.1 修改内容示例7-3-1中,字符数组a的容量是6个字符,其内容为hello。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字...
高质量C++/C编程指南-第7章-内存管理(3)

高质量C++/C编程指南-第7章-内存管理(3)

高质量C++/C编程指南-第7章-内存管理(3)2007-05-06林锐7.3.3 计算内存容量用运算符sizeof可以计算出数组的容量(字节数)。示例7-3-3(a)中,sizeof(a)的值是12(注意别忘了’’)。指针p指向a,但是sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。C++/C语言没有办法知道指针所指的内存容量,除非在申...
高质量C++/C编程指南-第7章-内存管理(5)

高质量C++/C编程指南-第7章-内存管理(5)

高质量C++/C编程指南-第7章-内存管理(5)2007-05-06林锐7.9 内存耗尽怎么办?如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。(1)判断指针是否为NULL,如果是则马上用return语句终止本函数。例如:void Func(void){A *a = new A;if(a == NULL){return;}…}(2)...
高质量C++/C编程指南-第7章-内存管理(7)

高质量C++/C编程指南-第7章-内存管理(7)

高质量C++/C编程指南-第7章-内存管理(7)2007-05-06林锐7.11 new/delete 的使用要点运算符new使用起来要比函数malloc简单得多,例如:int *p1 = (int *)malloc(sizeof(int) * length);int *p2 = new int[length];这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有...
高质量C++/C编程指南-第8章-C++函数的高级特性(1)

高质量C++/C编程指南-第8章-C++函数的高级特性(1)

高质量C++/C编程指南-第8章-C++函数的高级特性(1)2007-05-06林锐对比于C语言的函数,C++增加了重载(overloaded)、内联(inline)、const和virtual四种新机制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const与virtual机制仅用于类的成员函数。 重载和内联肯定有其好处才会被C++语言采纳,但是不可以当成免费的午餐而滥用。本章将探究重载和内联的优点与局限性,说明什么情况下应该采用、不该采用以...
高质量C++/C编程指南-第8章-C++函数的高级特性(2)

高质量C++/C编程指南-第8章-C++函数的高级特性(2)

高质量C++/C编程指南-第8章-C++函数的高级特性(2)2007-05-06林锐8.1.3 当心隐式类型转换导致重载函数产生二义性示例8-1-3中,第一个output函数的参数是int类型,第二个output函数的参数是float类型。由于数字本身没有类型,将数字当作参数时将自动进行类型转换(称为隐式类型转换)。语句output(0.5)将产生编译错误,因为编译器不知道该将0.5转换成int还是float类型的参数。隐式类型转换在很多地方可以简化程序的...
高质量C++/C编程指南-第8章-C++函数的高级特性(3)

高质量C++/C编程指南-第8章-C++函数的高级特性(3)

高质量C++/C编程指南-第8章-C++函数的高级特性(3)2007-05-06林锐8.2.2 令人迷惑的隐藏规则本来仅仅区别重载与覆盖并不算困难,但是C++的隐藏规则使问题复杂性陡然增加。这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。(2)如果派生类的函数与基类的函数同名,并且参数也相...
高质量C++/C编程指南-第8章-C++函数的高级特性(4)

高质量C++/C编程指南-第8章-C++函数的高级特性(4)

高质量C++/C编程指南-第8章-C++函数的高级特性(4)2007-05-06林锐8.3 参数的缺省值有一些参数的值在每次函数调用时都相同,书写这样的语句会使人厌烦。C++语言采用参数的缺省值使书写变得简洁(在编译时,缺省值由编译器自动插入)。参数缺省值的使用规则:l 【规则8-3-1】参数缺省值只能出现在函数的声明中,而不能出现在定义体中。例如:void Foo(int x=0, int y=0); // 正确,缺省值出现在函数的声明中void Foo...
高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(1)

高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(1)

高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(1)2007-05-06林锐构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数,如A(void); // 缺省的无参数...
高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2)

高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2)

高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2)2007-05-06林锐9.2 构造函数的初始化表构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。构造函数初始化表的使用规则:u 如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。例如class A{…A(...
高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(3)

高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(3)

高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(3)2007-05-06林锐9.3 构造和析构的次序构造从类层次的最根处开始,在每一层中,首先调用基类的构造函数,然后调用成员对象的构造函数。析构则严格按照与构造相反的次序执行,该次序是唯一的,否则编译器将无法自动执行析构过程。一个有趣的现象是,成员对象初始化的次序完全不受它们在初始化表中次序的影响,只由成员对象在类中声明的次序决定。这是因为类的声明是唯一的,而类的构造函数可以有多个,因此...
高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(4)

高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(4)

高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(4)2007-05-06林锐类String的赋值函数比构造函数复杂得多,分四步实现:(1)第一步,检查自赋值。你可能会认为多此一举,难道有人会愚蠢到写出 a = a 这样的自赋值语句!的确不会。但是间接的自赋值仍有可能出现,例如// 内容自赋值b = a;…c = b;…a = c; // 地址自赋值b = &a;…a = *b;也许有人会...
高质量C++/C编程指南-第10章-类的继承与组合(1)

高质量C++/C编程指南-第10章-类的继承与组合(1)

高质量C++/C编程指南-第10章-类的继承与组合(1)2007-05-06林锐对象(Object)是类(Class)的一个实例(Instance)。如果将对象比作房子,那么类就是房子的设计图纸。所以面向对象设计的重点是类的设计,而不是对象的设计。 对于C++程序而言,设计孤立的类是比较容易的,难的是正确设计基类及其派生类。本章仅仅论述“继承”(Inheritance)和“组合”(Composition)的概...
高质量C++/C编程指南-第10章-类的继承与组合(2)

高质量C++/C编程指南-第10章-类的继承与组合(2)

高质量C++/C编程指南-第10章-类的继承与组合(2)2007-05-06林锐10.2 组合l 【规则10-2-1】若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生而成。如示例10-2-1所示。class Eye{...
<< 151 152 153 154 155 156 157 158 159 160 >>