第三章构造函数和析构函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public: Tutorpair() { cout<<“Constructing tutorpair.\n”; nomeetings=0; }
24
h
protected: Student student; //class object as member data Teacher teacher; //class object as member data int nomeetings;
Desk( ) { weight=10;
high=5; width=5; length=5; } protected: int weight; int high;
13
h
int width; int length; }; void fn( ) { Desk da; //constructor call //…… }
1
h
第三章 类和对象之 构造函数和析构函数
▪ 构造函数
2
h
前面已经介绍过变量定义时若未显式初始化, 全局变量和静态变量在定义时初值为0,局部变量在 定义时初值为随机数。
与定义变量不同,一旦建立一个对象,对象通 常都需要有一个有意义的初值。
3
h
类创建对象时需要对对象初始化,但初始化任 务,只有由成员函数完成,因此,在类中必须定义 一个具有初始化功能的成员函数。
每当创建一个对象时,就调用这个成员函数, 实现初始化。
4
例:
h
class Student
{
public:
void init()
{
semeshours=100;
gpa=3.5;
}
//…… protected: int semeshours; int gpa;
}; void fn() {
Student s; s.init(); //调用类的初始化函数 //…… }
};
15
h
16
h
Desk::Desk() //constructor definition {
weight=10; high=5; width=5; length=5; cout<<weight<<“ ”<<high<<“ ”<<width<<“ ”<<length<<endl; };
void fn() {
构造函数的作用是在对象被创建时用特定 的方式构造对象,将对象初始化为一个特定的 状态,使此对象具有区别于其它对象的特征。 构造函数在对象被创建的时候由系统自动调用, 它完成的是一个由一般类到具体对象的过程。
由于类的唯一性和对象的多样性,因此C++ 规定构造函数与类同名。
8
h
普通构造函数例子:
class Person //类定义
strcpy(sex,lsex) ; age=lage ; strcpy(career,lcareer) ;//成员数据name,sex,age,career }
▪使用说明:
10
h
在类对象进入其作用域时调用构造函数;
构造函数没有返回值,定义时无需类型声明:
Void time(){ … … }; ×
semeshours=100;
gpa=3.5; }
//……
protected:
int semeshours;
float gpa;
};
22
h
class Teacher {
public: Teacher() { cout<<“Constructing teacher.\n”; }
};
23
h
class Tutorpair {
……
}
dd[4]
10
wHale Waihona Puke Baiduight
则执行定义数组语句时,
5
high
构造函数将被调用5 次,即
5
width
对每个数组成员对象的创 建都要调用一次构造函数。
5 ……
length
dd[5] 对象的内存空间分配及初始化
19
h
注意: 1、类体外定义构造函数,其函数名前要加上“类 名::”; 2、构造函数无返回类型; 3、在定义时,若类的数据成员是另一个类的对象, 则在调用构造函数创建对象时,对作为数据成员的 对象先要自动调用其自身的构造函数。
20
h
下面程序的 Tutorpair 类 (“帮教派对”) 中,其 成员包含有学生类对象和老师类对象。程序说明了 调用构造函数的方法。
#include <iostream.h> class Student
21
h
{ public:
Student()
{ cout<<“Constructing student.\n”;
14
2. 构造函数可以在类体外定义 h
structclass.cpp
#include <iostream> Using namespace std; class Desk {
public: Desk( );
protected: int weight; int high; int width; int length;
Desk da; }
void main() {
fn(); }
17
h
da
10 weight
5
high
5
width
5
length
……
da 对象的内存空间分配及初始化
18
若将fn() 函数改为 void fn() {
h
dd[0] 10 weight
5
high
5
width
……
Desk dd[5];
5
length
构造函数不需要用户调用,也不能被用户调用
建议不要在构造函数内放与初始化无关的东西
用户自己没有定义构造函数,C++会自动生成一个构
造函数,但这个构造函数的函数体是空的,也没有参数,
不执行初始化操作。
11
▪ 构造函数的使用方式
h
1. 构造函数在类体内定义
12
h
#include <iostream.h> class Desk { public:
5
h
这种将初始化工作 交由初始化成员函 数完成的方式使系 统多了一道处理过 程,增加了书写代 码,实现的机制并 不理想。
6
h
另一种方法是建立对象的同时,自动调用构造函 数,省去上述麻烦,使定义类对象时包含了为对象分 配存储空间和初始化的双重任务。这种实现机制较为 理想。
7
对象的初始化类中的一个特殊成h员函数来完 成,即构造函数。
{ public:
Person(char* lname,char* lsex,int lage, char* lcareer); //声明构造函数
…… };
9
h
Person::Person(char* lname,char* lsex,int lage, char* lcareer) //实现Person类构造函数 { strcpy(name,lname) ;
24
h
protected: Student student; //class object as member data Teacher teacher; //class object as member data int nomeetings;
Desk( ) { weight=10;
high=5; width=5; length=5; } protected: int weight; int high;
13
h
int width; int length; }; void fn( ) { Desk da; //constructor call //…… }
1
h
第三章 类和对象之 构造函数和析构函数
▪ 构造函数
2
h
前面已经介绍过变量定义时若未显式初始化, 全局变量和静态变量在定义时初值为0,局部变量在 定义时初值为随机数。
与定义变量不同,一旦建立一个对象,对象通 常都需要有一个有意义的初值。
3
h
类创建对象时需要对对象初始化,但初始化任 务,只有由成员函数完成,因此,在类中必须定义 一个具有初始化功能的成员函数。
每当创建一个对象时,就调用这个成员函数, 实现初始化。
4
例:
h
class Student
{
public:
void init()
{
semeshours=100;
gpa=3.5;
}
//…… protected: int semeshours; int gpa;
}; void fn() {
Student s; s.init(); //调用类的初始化函数 //…… }
};
15
h
16
h
Desk::Desk() //constructor definition {
weight=10; high=5; width=5; length=5; cout<<weight<<“ ”<<high<<“ ”<<width<<“ ”<<length<<endl; };
void fn() {
构造函数的作用是在对象被创建时用特定 的方式构造对象,将对象初始化为一个特定的 状态,使此对象具有区别于其它对象的特征。 构造函数在对象被创建的时候由系统自动调用, 它完成的是一个由一般类到具体对象的过程。
由于类的唯一性和对象的多样性,因此C++ 规定构造函数与类同名。
8
h
普通构造函数例子:
class Person //类定义
strcpy(sex,lsex) ; age=lage ; strcpy(career,lcareer) ;//成员数据name,sex,age,career }
▪使用说明:
10
h
在类对象进入其作用域时调用构造函数;
构造函数没有返回值,定义时无需类型声明:
Void time(){ … … }; ×
semeshours=100;
gpa=3.5; }
//……
protected:
int semeshours;
float gpa;
};
22
h
class Teacher {
public: Teacher() { cout<<“Constructing teacher.\n”; }
};
23
h
class Tutorpair {
……
}
dd[4]
10
wHale Waihona Puke Baiduight
则执行定义数组语句时,
5
high
构造函数将被调用5 次,即
5
width
对每个数组成员对象的创 建都要调用一次构造函数。
5 ……
length
dd[5] 对象的内存空间分配及初始化
19
h
注意: 1、类体外定义构造函数,其函数名前要加上“类 名::”; 2、构造函数无返回类型; 3、在定义时,若类的数据成员是另一个类的对象, 则在调用构造函数创建对象时,对作为数据成员的 对象先要自动调用其自身的构造函数。
20
h
下面程序的 Tutorpair 类 (“帮教派对”) 中,其 成员包含有学生类对象和老师类对象。程序说明了 调用构造函数的方法。
#include <iostream.h> class Student
21
h
{ public:
Student()
{ cout<<“Constructing student.\n”;
14
2. 构造函数可以在类体外定义 h
structclass.cpp
#include <iostream> Using namespace std; class Desk {
public: Desk( );
protected: int weight; int high; int width; int length;
Desk da; }
void main() {
fn(); }
17
h
da
10 weight
5
high
5
width
5
length
……
da 对象的内存空间分配及初始化
18
若将fn() 函数改为 void fn() {
h
dd[0] 10 weight
5
high
5
width
……
Desk dd[5];
5
length
构造函数不需要用户调用,也不能被用户调用
建议不要在构造函数内放与初始化无关的东西
用户自己没有定义构造函数,C++会自动生成一个构
造函数,但这个构造函数的函数体是空的,也没有参数,
不执行初始化操作。
11
▪ 构造函数的使用方式
h
1. 构造函数在类体内定义
12
h
#include <iostream.h> class Desk { public:
5
h
这种将初始化工作 交由初始化成员函 数完成的方式使系 统多了一道处理过 程,增加了书写代 码,实现的机制并 不理想。
6
h
另一种方法是建立对象的同时,自动调用构造函 数,省去上述麻烦,使定义类对象时包含了为对象分 配存储空间和初始化的双重任务。这种实现机制较为 理想。
7
对象的初始化类中的一个特殊成h员函数来完 成,即构造函数。
{ public:
Person(char* lname,char* lsex,int lage, char* lcareer); //声明构造函数
…… };
9
h
Person::Person(char* lname,char* lsex,int lage, char* lcareer) //实现Person类构造函数 { strcpy(name,lname) ;