标签:
第 9 章 类的构造函数、析构函数与赋值函数
1.构造函数初始化表的使用规则:
1)如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。
2)类的 const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化。
3)类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。
2. 类 String 的构造函数与析构函数
// String 的普通构造函数
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1];
*m_data = ‘\ 0’;
}
else
{
int length = strlen(str);
m_data = new char[length+1];
strcpy(m_data, str);
}
}
// String 的析构函数
String::~String(void)
{
delete [] m_data;
// 由于 m_data 是内部数据类型,也可以写成delete m_data;
}
3. 类 String 的拷贝构造函数与赋值函数
// 拷贝构造函数
String::String(const String &other)
{
// 允许操作 other 的私有成员m_data
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data);
}
// 赋值函数
String & String::operate =(const String&other)
{
// (1) 检查自赋值
if(this == &other)
return *this;
// (2) 释放原有的内存资源
delete [] m_data;
// (3)分配新的内存资源,并复制内容
int length =strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data);
// (4)返回本对象的引用
return *this;
}
第 10 章 类的继承与组合
1. 继承
规则1.如果类 A 和类 B 毫不相关,不可以为了使 B 的功能更多些而让 B
继承 A 的功能和属性。
规则2.若在逻辑上 B 是 A 的“一种” (a kind of ) ,则允许 B 继承 A 的功能和属性。
2.组合
规则.若在逻辑上 A 是 B 的“一部分” (a part of) ,则不允许 B 从 A 派生,而是要用 A 和其它东西组合出 B。
建议:
建议1.当心那些视觉上不易分辨的操作符发生书写错误。
我们经常会把“==”误写成“=” ,象“||” 、“&&” 、“<=” 、 “>=”这类符号也很容易发生“丢1”失误。然而编译器却不一定能自动指出这类错误。
建议2.变量(指针、数组)被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。
建议3.当心变量的初值、缺省值错误,或者精度不够。
建议4.当心数据类型转换发生错误。尽量使用显式的数据类型转换(让人们知道发生了什么事) ,避免让编译器轻悄悄地进行隐式的数据类型转换。
建议5.当心变量发生上溢或下溢,数组的下标越界。
建议6.当心忘记编写错误处理程序,当心错误处理程序本身有误。
建议7.当心文件 I/O 有错误。
建议8.避免编写技巧性很高代码。
建议9.不要设计面面俱到、非常灵活的数据结构。
建议10.如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码,应当重新编写。
建议11.尽量使用标准库函数,不要“发明”已经存在的库函数。
建议12.尽量不要使用与具体硬件或软件环境关系密切的变量。
建议13.把编译器的选择项设置为最严格状态。版权声明:本文为博主原创文章,未经博主允许不得转载。
《高质量程序设计指南C/C++语言》 林锐 韩永泉编著 总结3
标签:
原文地址:http://blog.csdn.net/weichanjuan3/article/details/47283549