12构造函数和析构函数2(VC++第10章)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
class dataclass
{private: int privatedata;
构造函数原型说明
public: dataclass(int value);
int publicdata;
int publicmethod(void);};
dataclass::dataclass(int value)
构造函数的定义
//结果
}; };
x=10
void main()
y=20 a=0
{ int x; ABC sa={10,20};
b=0
sa.print(); }
10.1 构造函c{la数ss ABC
private:
类对象(类变i量nt)x的,y;初始化
public:
int a,b;
void print()
{
cout<<"x="<<x<<endl;
说明:系统在生成类的对象时,自动调 用该类的构造函数初始化对象,无需 显式调用。
ABC sa1;//调用第一个构造函数,不能写成 ABC sa1();
ABC sa2(10,20); //调用第二个构造函数
ABC sa3(100,200,300,400); //调用第二个构造函数
cout<<"sa1中"<<endl;
int getb(){return b;}
void print();
};
10.1.1 构造函数的定义及对象初始化
ABC:: ABC(int x1,int y1,int a1,int b1)
{ x=x1;
y=y1; a=a1; b=b1;
说明: 5.构造函数既可以在类声明中定义,也
可以在类声明外定义
10.1.4 缺省构造函数
(1)在类中,若定义了没有参数的构造函数或各参 数均有缺省值的构造函数,则此构造函数也可看成 是缺省构造函数,缺省构造函数在一个类中只能有 一个. (2)任意一种形式的构造函数必须唯一 (3)缺省构造函数的调用: 类名 对象名;
缺省的构造函数
#include <iostream.h>
10.2.1 析构函数的定义
格式:
~className() //析构函数名 {……}//析构函数体
说明:
规定: 析构函数名必须与类名相同,并在其前面加上字 符“~”
析构函数不能有任何类型形式参数,void也不行,不 能有任何返回类型,void也不行。 析构函数是唯一的,不能重载。
{privatedata=value;}
int dataclass::publicmethod(void)
{return privatedata;}
void main()
定义对象的同时提供构
{ dataclass dataobject(1); dataobject.publicdata=2;
造函数的参数,并调用构 造函数
class Q
main()
{ private:
int x,y; public:
不能少
{ Q *q=new Q[2]; cout<<"====\n";
Q(int a=0,int b=0)
delete[] q;
{x=a;y=b;
cout<<"退出主函数";
cout<<"调用构造函数\n"; }
}
~Q()
};
10.1.4 缺省构造函数
1.C++规定,每个类必须有一个构造函数,没有构造函数, 就不能创建任何对象。
2.如果在定义类时没有定义任何构造函数,则C++自动生成 一个缺省构造函数。其格式为:
className::className(){ } 即一个空的构造函数 缺省构造函数只能有一个 3.只要一个类显式地定义了一个构造函数,则C++就不再提 供默认的构造函数。也就是说,如果为类定义了一个带参 数的构造函数,但在编程中,还想使用无参数的构造函数, 则必须自己定义。 4.当使用默认构造函数创建全局对象时,对象的数据成员的 值默认取0;而使用默认构造函数创建局部对象时,对象 的的数据成员的值是随机数; 5.要对对象的数据成员进行初始化,必须定义构造函数 6.定义类的对象时,系统必定调用构造函数对某个对象来 说,构造函数必须唯一。
cout<<"y="<<y<<endl;
cout<<"a="<<a<<endl;
编译错误
cout<<"b="<<b<<endl; };
};
只要类定义中有私有成员(无论是数据成员还是 函数成员),则无i{法nt直m接a初in始(in化t argc, char* argv[])
对于类对象的初始i化nt方x法; 构造函数
必须由用户告知 用户告知的方式就是定义一个含参数的构造函
数。
10.4 实现类型转换的构造函数
class student { public:
student(char *); //… } void fn(student &s); void main() {//…… fn("Jenny"); //…… }
局部对象(函数内定义):程序执行到定义对象的地方, 调用构造函数,退出对象作用域时,调用析构函数;
static定义的局部对象:首次执行对象的定义时,调用 构造函数,程序结束时调用析构函数
new运算符生成的对象:用new产生对象时调用构造 函数,用delete释放对象时,调用析构函数
10.2.3 用delete运算符撤消对象数组
class Q
{
int x,y;
public:
Q(int a=0,int b=0)
{x=a;y=b;}
void p()
{cout<<x<<'\t'<<y<<'\n';}
};
void main()
{ cout <<"welcome your executive!\n";
Q q; 0 0 q.p();
调用缺省的构造函数,a=0, b=0
调用构造函数
{cout<<"调用析构函数\n";}调用构造函数
void p()
====
{cout<<x<<'\t';
调用析构函数
cout<<y<<'\n'; } };
调用析构函数 退出主函数
10.2.4 缺省的析构函数
如果在定义类时没有显式地定义析构函数, 则C++自动生成一个缺省析构函数。其格 式为: className::~className(){ } 即一个空的析构函数
ABC sa={10,20};
sa.print();
}
10.1.1 构造函说数明:的定义及对象初始化
class ABC { private:
int x,y, a,b; public:
ABC()
1.构造函数名与类名必须相同 2.构造函数不能有任何返回类型,包括
void也不行 3.一个类可以定义多个构造函数构造
当p使r用iv类at的e:缺省构造函数创 建一i个n对t x象,y时; ,对象名后不 能p带u括b号lic“: ()” Q(int a=0,int b=0) Q qq{x=a;y=b;}
void p()
Q(){};
{cout<<x<<&合t<生适<对的y象构<<e造时'函\没n数'有; 可用
函数的重载
4.一般,构造函数总是定义成公有的, 特殊情况下才定义成保护型
{x=0;y=0;a=0;b=0;};
ABC(int x1,int y1,int a1=100,int b1=100);
int getx(){return x;}
int gety(){return y;}
int geta(){return a;}
//….
pusb{tluincd:aemnte(=chnaerw*cp储在hn空定aarn间义(e1;一)2个);对}象时析要构为函对数象中分释配放存内存
在对象结束其生命期或作用域时,
~student()
系统要收回对象所占的存储空间,
{ delete na即m要e撤; 消对}象。
};
析构函数完成撤消对象的工作。
ABC sa={10,20};
10.1 构造函cla数ss ABC
{
类对象(类变pui量nbtli)cx的:,y;初始化
int a,b;
void print()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
Q q1(50,100);
q1.p();
50 100
Q q2(500);
q2.p();
500 0
10.1.4 缺省构造函Q数qq();//什么意思?
class E {
说cl明as了s一Q个全局函数qq, 该 函{数返回值类型为类类型Q
private: int x,y;
public: E(int a,int b) {x=a;y=b;}
}
void ABC::print() {
cout<<"x="<<getx()<<endl; cout<<"y="<<gety()<<endl; cout<<"a="<<geta()<<endl; cout<<"b="<<getb()<<endl; }
10.1.1 构造函数的定义及对象初始化
void main() {
定{i义nt类x对,y;象指针,然后 用punbTelDiwc:*运pd算=符ne为w类T对D(5,10);//调用带参构造函数
象T指pD针d(-in分>ts配xh1o空,wi间nXt及Yy(1初)); 始
化T{D自*动p调=n用e构w造TD函; //调用不带参构造函数
数
p-x>=sxh1o;wyX=Yy(1);; decoleutte<p<d;"调用构造函数TD(int,int)\n
};
{c产o生ut对<象<xq<时<,'\有t两'; c个o构ut造<函<y数<可<用'\,n不';
} 知用哪一个
E e; //错误,为什么?
Q q;//错误,为什么?
10.2 析构函数
为什么要使用析构函数?
class student
{
private: char *name;
构造函数中分配了内存
第十章
构造函数和析构函数
10.1 构造函数
简单类型变量的初始化方法
int x=5; float y=10.0
数组的初始化
float a[]={10.5,11,21.0,30.0}; char str[]="China";
结构体变量的初始化
struct ABC { int x; int y; };
sa1.print();
cout<<"sa2中"<<endl;
sa2.print();
cout<<"sa1中"<<endl;
sa3.print(); }
产生全局对象、静态对象和局部对象时 调用构造函数的时机
(参考P221-223例10.5及解释)
使用构造函数初始化
#include <iostream.h>
如果在构造函数中利用new运算符分配了 内存空间,则必须显式地定义析构函数来释 放内存空间
10.4 实现类型转换的构造函数
4/8=? 4.0/8=?
4.0/8匹配了两个double类型数的除法, C++知道何时将8转换成double型,这是 基本数据类型的转换。
对于用户自定义数据类型如何转换呢?
析构函数在撤消对象时自动调用
10.2.2 不同存储类型调用构造函数及析构 函数的时机
在定义对象时调用构造函数,撤消对象时调 用析构函数
对不同存储类型的对象(全局对象,静态对 象全,局对局象部:对程序象执)行,时调,用调用构构造造函函数数,和程析序结构束函时数调 的用时析构机函不数同; 。
";
d}elete p;
}TD{(c)out<<"调调用用构构造造函函数数TTDD(()i\nnt",i;nt})
x=5 y=10
void showXY调()用构造函数TD() { cout<<"x="<<x<<"\t"; cout<<"yx=="8<4<4y5<86<3e4n4dl; y=844586344 }
如果有重载函数fn(char*), 则调用fn("Jenny")马上匹 配了事,但是由于没有这样的 重载函数,所以C++试着对 函数fn()的参数进行类型转 换。
因为有student(char *)这 样的构造函数,又有 fn(student &s)函数,于 是fn("Jenny")便被认为是
cout<<“dataobject.publicdata=“<<dataobject.publicdata;
cout<<“dataobject.privatedata=“<<dataobject.publicmethod() <<‘\n’;
}
1c{0la.s1s T.3D 构造函数和new运算符
prmivaaitne(:)