c++ 第十二章 构造函数
时间:2025-04-23
时间:2025-04-23
C++课件
C++课件
第十二章 构造函数
C++课件
12.1 类与对象一个类描述一类事物,描述这些事物所应具有的属性。 一个对象是类的一个实例,它具有确定的属性。
对象的意义表达了现实世界的实体,因此,一旦建立对象 ,须有一个有意义的初始值。C++建立和初始化对象的过程专 门由该类的构造函数来完成。只要对象建立,构造函数马上被 调用,给对象分配空间和初始化。
12.2 构造函数的使用C++规定与类同名的成员函数是构造函数,在该类的对象 创建时,自动被调用。 例如,下面的代码初始化桌子和凳子类对象:
C++课件
#include <iostream.h> class Desk { public: Desk(); protected: int weight; int high; int width; int length; };
//构造函数声明
class Stool { public: Stool(); //构造函数声明 protected: int weight; int high; int width; int length; };
C++课件
Desk::Desk() //构造函数定义 { weight=10; high=5; width=5; length=5; cout <<weight <<" " <<high <<" " } Stool::Stool() //构造函数定义 { weight=6; high=3; width=3; length=3; cout <<weight <<" " <<high <<" " } void fn() { Desk da; //自动调用Desk() Stool sa; //自动调用Stool() } void main() { fn(); }
<<width <<" " <<length <<endl;
<<width <<" " <<length <<endl;
C++课件
构造函数一个特殊之处是它没有返回类型,函数体中也不 允许返回值。 一个类定义中,类的数据成员可能为另一个类的对象。 如果一个类对象是另一个类的数据成员,则在那个类的对 象创建所调用的构造函数中,对该成员(对象)自动调用其构造函 数。 例如,下面的程序,一个“帮教派对”类TutorPair,包含 有学生类和老师类对象:
C++课件
#include <iostream.h> class Student { public: Student() { cout <<"constructing student.\n"; semesHours=100; gpa=3.5; } //其他公共成员 protected: int semesHours; float gpa; }; class Teacher { public: Teacher() { cout <<"constructing teacher.\n"; } };
C++课件
class TutorPair { public: TutorPair() { cout <<"constructing tutorpair.\n"; noMeetings=0; } protected: Student student; Teacher teacher; int noMeetings; //会晤次数 }; void main() { TutorPair tp; cout <<"back in main.\n"; }
12.3 析构函数一个类可能在构造函数里分配资源,这些资源需要在对象不 复存在以前被释放。析构函数允许类自动完成这些清理工作。
C++课件
析构函数也是特殊的成员函数,它没有返回类型,没有参 数,不能随意调用。只是在类对象生命期结束的时候,由系统 自动调用。 作为一个类,可能有许多对象,每当对象生命期结束时, 都要调用析构函数,每个对象一次。这跟构造函数形成了鲜明 的对立,所以析构函数名,就在构造函数名前加上一个逻辑非 运算符“~”,表示“逆构造函数”。 析构函数以调用构造函数相反的顺序被调用。 例如,下面的程序在上例的基础上加了析构函数:
C++课件
#in
clude <iostream.h> class Student { public: Student() { cout <<"constructing student.\n"; semesHours=100; gpa=3.5; } ~Student() { cout <<"destructing student.\n"; } //其他公共成员 protected: int semesHours; float gpa; };
C++课件
class Teacher { public: Teacher() { cout <<"constructing teacher.\n"; } ~Teacher() { cout <<"destructing teacher.\n"; } };
class TutorPair { public: TutorPair() { cout <<"constructing tutorpair.\n"; noMeetings=0; }
C++课件
~TutorPair() { cout <<"destructing tutorpair.\n"; } protected: Student student; Teacher teacher; int noMeetings; }; void main() { TutorPair tp; cout <<"back in main.\n"; }
运行结果为:
C++课件
12.4 带参数的构造函数例如,下面的程序定义了一个带参数的学生类:#include <iostream.h> #include <string.h> class Student { public: Student(char* pName) { cout <<"constructing student " <<pName <<endl; strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]='\0'; } ~Student() { cout <<"destructing " <<name <<endl; } //其他公共成员 protected: char name[20]; };
C++课件
void main() { Student ss("Jenny"); //... }
学生类中定义了一个带字符串参数的构造函数。
12.5 重载构造函数构造函数可以被重载,C++根据声明中的参数选择合适的 构造函数。 例如,下面的程序同时声明了四个构造函数:#include <iostream.h> class Tdate{ public: Tdate(); Tdate(int d); Tdate(int m,int d); Tdate(int m,int d,int y); //其他公共成员 protected: int month; int day; int year; };
C++课件
Tdate::Tdate() { month=4; day=15; year=1995; cout <<month <<"/" <<day <<"/" <<year <<endl;} Tdate::Tdate(int d) { month=4; day=d; year=1996; cout <<month <<"/" <<day <<"/" <<year <<endl;} Tdate::Tdate(int m,int d) { month=m; day=d; year=1997; cout <<month <<"/" <<day <<"/" <<year <<endl;} Tdate::Tdate(int m,int d,int y) { month=m; day=d; year=y; cout <<month <<"/" <<day <<"/" <<year <<end …… 此处隐藏:1599字,全部文档内容请下载后查看。喜欢就下载吧 ……