- 1
- 0
- 约4.11千字
- 约 18页
- 2018-04-23 发布于河南
- 举报
9对象的生灭
* * 第九章 对象生灭 构造函数设计 ( Constructor Design ) 构造函数重载 ( Constructor Overload ) 类成员初始化 ( Class Member Initializations ) 构造顺序 ( Constructing Order ) 拷贝构造函数 ( Copy Constructors ) 析构函数 ( Destructors ) 赋值 (Assignment ) * * 1. 构造函数设计 ( Constructor Design ) 初始化要求:对象与变量的不同在于对象对应于事物,要求从诞生之时起便有明确的意义. 封装性要求:初始化不是简单的参数与成员对应,而是联系参数到成员的过程. 构造函数名:该过程产生对象,而不是捆绑对象的成员函数调用,因而它是特殊的成员函数 形式:与变量的定义形式保持一致.构造函数原则上不能失败,也没有返回形式 例外:一次性对象构造,没有对象名,与强制转换的形式一致,因而它是一个特定类型的对象. 01 * * 2. 构造函数重载 ( Constructor Overload ) 构造函数可以重载,也可以参数默认: class Date{ public: Date(const string s); Date(int y=2003, int m=12, int d=1); // ... }; int main(){ Date d(“2006-12-26”); Date e(2000, 12, 25); Date f(2001, 10); Date g(2002); Date h(); // ... } 02、03 * * 若类中没有定义构造函数,则系统会默认定义一个无参空函数: class Date{ public: // 相当于定义了Date(){} }; int main(){ Date d; // ok // ... } * * 任何其他的构造函数定义,都将阻止默认无参空函数的产生: class Date{ public: Date(int y, int m, int d){} // ... }; int main(){ Date d; // error // ... } * * 3. 类成员初始化 ( Class Member Initializations ) class StudentID{ int a; public: StudentID(){ a = 1; cout“StudentId: a\n; } }; class Student{ string name; StudentID id; public: Student(string n=noName){ cout“Student: + n +\n; name = n; } }; int main(){ Student s(Randy); } 数据成员的空间分配是在构造函数被调用和其过程被执行之间的刹那间完成,在类中有对象成员时,那个刹那间便是调用对象所在类的构造函数,以创建对象空间的时机,左边的程序得到下列运行结果:StudentId: 1Student: Randy说明先成员构造,后自身构造.成员构造不见显式调用,而是悄悄调用无参构造函数. * * class StudentID{ int a; public: StudentID(int id=0){ a=id; cout“StudentId: a“\n”; } }; class Student{ string name; StudentID id; public: Student(string n=noName, int ssID=0) :id(ssID),name(n){ cout“Student: n\n; } }; int main(){ Student s(Randy, 98); Student t(Jenny); } 若要调用对象成员的有参构造函数,须显式调用,见左边形式.其运行结果为:StudentId: 98Student: RandyStudentId: 0Student: Jenny 04 * * 4. 构造顺序 ( Constructing Order ) 局部对象是在块中创建的对象: C 的局部变量创建顺序按语句行的顺序 C++的局部对象创建顺序按运行中定义对象的顺序,静态对象只创建一次 05 * * 同一工程不同代码文件全局对象的创建没有明确顺
原创力文档

文档评论(0)