关于类和对象的进一步讨论.ppt
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else {
int temp=q[head]; head=(head+1)%100; return (temp); } }
main 函数的N-S 流程图:
#include <iostream>//main.cpp 主函数 #include "queue.h“ using namespace std; int main() {
引言
int i=5,j(5),k; 能否对自定义类的对象用同样的方式进行初始化呢? student stud1(1001) student stud2(1001,“张三” ) student stud3(1001,“张三”,”男”)
……
注意
类的数据成员是不能在声明类时初始化的。 Class time {
构造函数的重载
在一个类中允许定义多个构造函数,以便对类对象提 供不同的初始化的方法,共用户选用。
这些构造函数具有相同的名字,而参数的个数或参数 的类型不相同。
在类对象定义时,编译器可以依据创建对象所需要的 参数差异确定调用构造函数的哪一个版本来创建类对 象。
例P74页3.3 *.h
class box { public:
hour=0;minute=0;sec=0; }; 类并不是一个实体,而是一种抽象类型,并不占存储
空间,无法容纳数据。
对象的初始化
如果一个类中所有的成员都是public的,则可以在定义 对象时对数据成员进行初始化。
例如: class time { public: int hour,minute,sec; }; time t1={14,56,30}
if((trail+1)%100==head) cout<<"队列已满!"<<endl;
else {
q[trail]=i; trail=(trail+1)%100;} return; }
int queue::qget()//出队操作 {
if(trail==head) {
cout<<"队列为空!"<<endl; return 0; }
带参数的构造函数
#include " *.h " int main() {
box s1(2,3,4),s2(12,15,21); cout<<s1.volume()<<endl; cout<< s2.volume()<<endl; return 0; }
注意
带参数的构造函数中的形参,其对应的实参在定义对 象时给定。
第三章 关于类和对象的进一步讨论
计算机信息工程学院
第三章 关于类和对象的进一步讨论
3.1 构造函数 3.2 析构函数 3.3 调用构造函数和析构函数的顺序 3.4 对象数组 3.5 对象指针 3.6 公用数据的保护 3.7 对象的动态建立和释放 3.8 对象的赋值和复制 3.9 静态成员 3.10 友元
#include " *.h " cmax::cmax(int a,int b) { x=a;y=b;} int cmax::max() { if(x>y) return x;
else return y; }
构造函数-求两个整数的最大
#include " *.h “ #include <iostream> using namespace std; int main() {
思考题
如何用类实现栈?
带参数的构造函数
与其他成员函数一样,构造函数也可以有参数。 通 过 这些参数为类的不同对象的数据成员传递不同的初值。 构造函数首部的一般格式为:
构造函数名(类型1 形参1,类型2 形参2,……) 定义对象的一般格式为:
类名 对象名(实参1,实参2,……)
带参数的构造函数
queue a,b; a.qput(10); a.qput(20); b.qput(20); b.qput(19); cout<<"a队列中的数据依次为:"; cout<<a.qget()<<"\t"; cout<<a.qget()<<endl; cout<<"b队列中的数据依次为:"; cout<<b.qget()<<"\t"; cout<<b.qget()<<endl; return 0;}
注意
在程序运行过程中,类对象是在进入其作用域时才被创 建的。也就是说,此时类对象的构造函数被调用。 构造函数在类对象创建时由系统自动执行,不需要户调 用,也不能由用户调用。例如: time t1; // 系统调用构造函数创建stud1 t1.time(); //企图用一般成员函数的调用方法,调用构造函数,因 此是错误的。
构造函数
构造函数是使用类定义对象时,对对象的数据成员进行 初始化的成员函数。 构造函数是类必须拥有的特殊成员函数。 构造函数的名字必须跟类同名,以便编译系统能识别。 构造函数不具有任何类型,不返回任何值。
构造函数的作用是在对象被创建时使用特定的值构造对 象,或者说将对象初始化为一个特定的状态。
例: 定义一个整数队列类,并测试队列功能。
队列的特点:先进先出 用户可以实现:
出队 入队 辅助操作: 判断队列是否为空 判断队列是否满 初始化一个空队列
queue.h 定义类
class queue {
int q[100]; int head,trail; public: queue();//构造函数 void qput(int i);//入队操作 int qget();//出队操作 };
成员函数qput 的N-S 流程图: 成员函数qget 的N-S 流程图:
//queue.cpp 类实现 #include <iostream.h> #include "queue.h" using namespace std; queue::queue()//构造函数 {
head=trail=0; } void queue::qput(int i)//入队操作 {
主函数所在 的*.cpp
#include " *.h “
#include <iostream>
using namespace std; int main() {
box s1,s2; s1.input(); cout<<s1.volume()<<endl; cout<< s2.volume()<<endl;//结果为:1 return 0; }
box(); //无参的构造函数 box(int x,int y,int z):l(x),w(y),h(z){}//有参数的构造函 数,用参数的初始化表对数据成员赋值。 int volume(); private: int w,h,l; };
例P74页3.3 *.cpp
#include " *.h " box::box() { l=10;w=10;h=10; } int box::volume() { return(l*w*h);}
注意
构造函数没有返回值,因此,声明和定义构造函数时 都不能说明它的返回类型;
构造函数的功能是将对象初始化,在构造函数体内可 以对数据成员赋初值,也可以包含cout等其他语句。 但一般不加入与初始化无关的内容。
系统总会为类提供一个隐含的缺省构造函数。该构造 函数实际上是一个空定义体函数,因此只能为对象分 配空间而不能为数据成员进行初始化。
用带参数的构造函数可以方便的实现对不同对象进行 不同的初始化。
构造函数-求两个整数的最大*.h
class cmax { public:
cmax(int ,int ) ; //构造函数对x、y初始化 int max(); //求x和y的最大值 private: int x; int y; };
构造函数-求两个整数的最大*.cpp
无参构造函数
无参构造函数就没有参数的构造函数,称为默认构造函数。 例如:P70例3.1time类 长方体类
time类的声明 *.h
class time{ public:
time(); //构造函数 void set_time(); void show_time(); private: int hour,minute,sec; };
使用默认参数的构造函数
与其他函数一样,构造函数的参数也可以具有缺省值, 表示类对象的某些属性在大多数情况下是预先可以确定的缺 省状态,构造函数的缺省参数值的定义和使用规则与其他带 缺省参数值的函数相同。
P75例3.4
class box { public:
box(int x=10,int y=10,int z=10); int volume(); private: int w,h,l; };
box(); //构造函数 void input();//输入长、宽、高 int volume();//计算体积 private: int w,h,l; };
长方体类的定义 *.cpp
#clude <iostream>
#include " *.h " box::box()//构造函数 { l=1;w=1;h=1; } void box::input()//输入长宽高 { cout<<"l w h :"<<endl; cin>>l>>w>>h; } float box::volume()//计算体积 { return(l*w*h);}
注意
在调用构造函数时不必给出实参(即:无参)的构造 函数,称为默认构造函数;
一个类只能有一个默认构造函数。 在建立对象时如果选用的是无参构造函数,应注意正
确书写定义对象的语句。 应为:box b1 ,而不应为:box b1(); 一个类中可以包含多个构造函数,但建立对象时只能
执行其中的一个构造函数。
class box { public:
box(int,int,int); //构造函数 int volume();//计算体积 private: int w,h,l; };
带参数的构造函数
#include <iostream>
#include " *.h " box::box(float x,float y,float z) { l=x;w=y;h=z; } void box::input() { cout<<"l w h :"<<endl; cin>>l>>w>>h; } int box::volume() { return(l*w*h);}
例P74页3.3 *.cpp
#include <iostream>
using namespace std;
#include " *.h " int main() {
box s1; cout<<s1.volume()<<endl; box s2(2,1,2); cout<< s2.volume()<<endl; return 0; }
cmax m(4,5); cout<<“最大值为”<<m.max()<<endl;
return 0; }
用参数初始化表对数据成员初始化
利用参数初始化表来实现对数据成员的初始化。 这种方法不在函数体内对数据成员初始化,而是在函
数首部实现。 可以直接在类体中定义构造函数。 例如:box::box(int x,int y,int z):l(x),w(y),h(z){}
P75例3.4
#include <iostream> #include " *.h " box::box(int x,int y,int z) { l=x;w=y;h=z; } int box::volume() { return(l*w*h);}
time类的定义 *.cpp
#include <iostream> #include " *.h " Time::time() { hour=0;minuter=0;sec=0; } void time::set_time() { cin>>hour>>minute>>sec; } void time::show_time() { cout<<hour<<":"<<minute<<":"<<sec<<endl;}
主函数所在 的*.cpp
#include " *.h " int main() {
time t1,t2; t1.set_time(); t1.show_time(); t2.show_time(); //显示结果为:0:0:0 return 0; }
长方体类的声明 *.h
class box { public:
int temp=q[head]; head=(head+1)%100; return (temp); } }
main 函数的N-S 流程图:
#include <iostream>//main.cpp 主函数 #include "queue.h“ using namespace std; int main() {
引言
int i=5,j(5),k; 能否对自定义类的对象用同样的方式进行初始化呢? student stud1(1001) student stud2(1001,“张三” ) student stud3(1001,“张三”,”男”)
……
注意
类的数据成员是不能在声明类时初始化的。 Class time {
构造函数的重载
在一个类中允许定义多个构造函数,以便对类对象提 供不同的初始化的方法,共用户选用。
这些构造函数具有相同的名字,而参数的个数或参数 的类型不相同。
在类对象定义时,编译器可以依据创建对象所需要的 参数差异确定调用构造函数的哪一个版本来创建类对 象。
例P74页3.3 *.h
class box { public:
hour=0;minute=0;sec=0; }; 类并不是一个实体,而是一种抽象类型,并不占存储
空间,无法容纳数据。
对象的初始化
如果一个类中所有的成员都是public的,则可以在定义 对象时对数据成员进行初始化。
例如: class time { public: int hour,minute,sec; }; time t1={14,56,30}
if((trail+1)%100==head) cout<<"队列已满!"<<endl;
else {
q[trail]=i; trail=(trail+1)%100;} return; }
int queue::qget()//出队操作 {
if(trail==head) {
cout<<"队列为空!"<<endl; return 0; }
带参数的构造函数
#include " *.h " int main() {
box s1(2,3,4),s2(12,15,21); cout<<s1.volume()<<endl; cout<< s2.volume()<<endl; return 0; }
注意
带参数的构造函数中的形参,其对应的实参在定义对 象时给定。
第三章 关于类和对象的进一步讨论
计算机信息工程学院
第三章 关于类和对象的进一步讨论
3.1 构造函数 3.2 析构函数 3.3 调用构造函数和析构函数的顺序 3.4 对象数组 3.5 对象指针 3.6 公用数据的保护 3.7 对象的动态建立和释放 3.8 对象的赋值和复制 3.9 静态成员 3.10 友元
#include " *.h " cmax::cmax(int a,int b) { x=a;y=b;} int cmax::max() { if(x>y) return x;
else return y; }
构造函数-求两个整数的最大
#include " *.h “ #include <iostream> using namespace std; int main() {
思考题
如何用类实现栈?
带参数的构造函数
与其他成员函数一样,构造函数也可以有参数。 通 过 这些参数为类的不同对象的数据成员传递不同的初值。 构造函数首部的一般格式为:
构造函数名(类型1 形参1,类型2 形参2,……) 定义对象的一般格式为:
类名 对象名(实参1,实参2,……)
带参数的构造函数
queue a,b; a.qput(10); a.qput(20); b.qput(20); b.qput(19); cout<<"a队列中的数据依次为:"; cout<<a.qget()<<"\t"; cout<<a.qget()<<endl; cout<<"b队列中的数据依次为:"; cout<<b.qget()<<"\t"; cout<<b.qget()<<endl; return 0;}
注意
在程序运行过程中,类对象是在进入其作用域时才被创 建的。也就是说,此时类对象的构造函数被调用。 构造函数在类对象创建时由系统自动执行,不需要户调 用,也不能由用户调用。例如: time t1; // 系统调用构造函数创建stud1 t1.time(); //企图用一般成员函数的调用方法,调用构造函数,因 此是错误的。
构造函数
构造函数是使用类定义对象时,对对象的数据成员进行 初始化的成员函数。 构造函数是类必须拥有的特殊成员函数。 构造函数的名字必须跟类同名,以便编译系统能识别。 构造函数不具有任何类型,不返回任何值。
构造函数的作用是在对象被创建时使用特定的值构造对 象,或者说将对象初始化为一个特定的状态。
例: 定义一个整数队列类,并测试队列功能。
队列的特点:先进先出 用户可以实现:
出队 入队 辅助操作: 判断队列是否为空 判断队列是否满 初始化一个空队列
queue.h 定义类
class queue {
int q[100]; int head,trail; public: queue();//构造函数 void qput(int i);//入队操作 int qget();//出队操作 };
成员函数qput 的N-S 流程图: 成员函数qget 的N-S 流程图:
//queue.cpp 类实现 #include <iostream.h> #include "queue.h" using namespace std; queue::queue()//构造函数 {
head=trail=0; } void queue::qput(int i)//入队操作 {
主函数所在 的*.cpp
#include " *.h “
#include <iostream>
using namespace std; int main() {
box s1,s2; s1.input(); cout<<s1.volume()<<endl; cout<< s2.volume()<<endl;//结果为:1 return 0; }
box(); //无参的构造函数 box(int x,int y,int z):l(x),w(y),h(z){}//有参数的构造函 数,用参数的初始化表对数据成员赋值。 int volume(); private: int w,h,l; };
例P74页3.3 *.cpp
#include " *.h " box::box() { l=10;w=10;h=10; } int box::volume() { return(l*w*h);}
注意
构造函数没有返回值,因此,声明和定义构造函数时 都不能说明它的返回类型;
构造函数的功能是将对象初始化,在构造函数体内可 以对数据成员赋初值,也可以包含cout等其他语句。 但一般不加入与初始化无关的内容。
系统总会为类提供一个隐含的缺省构造函数。该构造 函数实际上是一个空定义体函数,因此只能为对象分 配空间而不能为数据成员进行初始化。
用带参数的构造函数可以方便的实现对不同对象进行 不同的初始化。
构造函数-求两个整数的最大*.h
class cmax { public:
cmax(int ,int ) ; //构造函数对x、y初始化 int max(); //求x和y的最大值 private: int x; int y; };
构造函数-求两个整数的最大*.cpp
无参构造函数
无参构造函数就没有参数的构造函数,称为默认构造函数。 例如:P70例3.1time类 长方体类
time类的声明 *.h
class time{ public:
time(); //构造函数 void set_time(); void show_time(); private: int hour,minute,sec; };
使用默认参数的构造函数
与其他函数一样,构造函数的参数也可以具有缺省值, 表示类对象的某些属性在大多数情况下是预先可以确定的缺 省状态,构造函数的缺省参数值的定义和使用规则与其他带 缺省参数值的函数相同。
P75例3.4
class box { public:
box(int x=10,int y=10,int z=10); int volume(); private: int w,h,l; };
box(); //构造函数 void input();//输入长、宽、高 int volume();//计算体积 private: int w,h,l; };
长方体类的定义 *.cpp
#clude <iostream>
#include " *.h " box::box()//构造函数 { l=1;w=1;h=1; } void box::input()//输入长宽高 { cout<<"l w h :"<<endl; cin>>l>>w>>h; } float box::volume()//计算体积 { return(l*w*h);}
注意
在调用构造函数时不必给出实参(即:无参)的构造 函数,称为默认构造函数;
一个类只能有一个默认构造函数。 在建立对象时如果选用的是无参构造函数,应注意正
确书写定义对象的语句。 应为:box b1 ,而不应为:box b1(); 一个类中可以包含多个构造函数,但建立对象时只能
执行其中的一个构造函数。
class box { public:
box(int,int,int); //构造函数 int volume();//计算体积 private: int w,h,l; };
带参数的构造函数
#include <iostream>
#include " *.h " box::box(float x,float y,float z) { l=x;w=y;h=z; } void box::input() { cout<<"l w h :"<<endl; cin>>l>>w>>h; } int box::volume() { return(l*w*h);}
例P74页3.3 *.cpp
#include <iostream>
using namespace std;
#include " *.h " int main() {
box s1; cout<<s1.volume()<<endl; box s2(2,1,2); cout<< s2.volume()<<endl; return 0; }
cmax m(4,5); cout<<“最大值为”<<m.max()<<endl;
return 0; }
用参数初始化表对数据成员初始化
利用参数初始化表来实现对数据成员的初始化。 这种方法不在函数体内对数据成员初始化,而是在函
数首部实现。 可以直接在类体中定义构造函数。 例如:box::box(int x,int y,int z):l(x),w(y),h(z){}
P75例3.4
#include <iostream> #include " *.h " box::box(int x,int y,int z) { l=x;w=y;h=z; } int box::volume() { return(l*w*h);}
time类的定义 *.cpp
#include <iostream> #include " *.h " Time::time() { hour=0;minuter=0;sec=0; } void time::set_time() { cin>>hour>>minute>>sec; } void time::show_time() { cout<<hour<<":"<<minute<<":"<<sec<<endl;}
主函数所在 的*.cpp
#include " *.h " int main() {
time t1,t2; t1.set_time(); t1.show_time(); t2.show_time(); //显示结果为:0:0:0 return 0; }
长方体类的声明 *.h
class box { public: