欢迎来到天天文库
浏览记录
ID:17949114
大小:100.50 KB
页数:14页
时间:2018-09-11
《类及构造函数和析构函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C++面向对象编程入门:构造函数与析构函数 请注意,这一节内容是c++的重点,要特别注意! 我们先说一下什么是构造函数。 上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能够在对象创建的时候就自动初始化成员变量呢,这一点对操作保护成员是至关重要的,答案是肯定的。关于c++类成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用,在正式讲解之前先看看c++对构造函数的一个基本定义。 1.C++规定,每个类必须
2、有默认的构造函数,没有构造函数就不能创建对象。 2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。 3.只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数。 4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。 我们来看下面的代码:#includeusingnamespacestd;classStudent{
3、public:Student()//无参数构造函数{number=1;score=100;}voidshow();protected:intnumber;intscore;};voidStudent::show(){cout<4、么它和c++的默认提供的构造函数等价的。 构造函数可以带任意多个的形式参数,这一点和普通函数的特性是一样的! 下面我们来看一个带参数的构造函数是如何进行对象的始化操作的。 代码如下:#includeusingnamespacestd;classTeacher{public:Teacher(char*input_name)//有参数的构造函数{name=newchar[10];//name=input_name;//这样赋值是错误的strcpy(name,input_name);}voidshow();prote5、cted:char*name;};voidTeacher::show(){cout<6、创建一个类对象。 一旦类中有了一个带参数的构造函数而又没无参数构造函数的时候系统将无法创建不带参数的对象,所以上面的代码Teachera; 就是错误的!!! 这里还有一处也要注意://name=input_name;//这样赋值是错误的 因为name指是指向内存堆区的,如果使用name=input_name;会造成指针指向改变不是指向堆区而是指向栈区,导致在后面调用析构函数delete释放堆空间出错!(析构函数的内容我们后面将要介绍) 如果需要调用能够执行就需要再添加一个没有参数的构造函数 对上面的代码改造如下:#inclu7、deusingnamespacestd;classTeacher{public:Teacher(char*input_name){name=newchar[10];//name=input_name;//这样赋值是错误的strcpy(name,input_name);}Teacher()//无参数构造函数,进行函数重载{}voidshow();protected:char*name;};voidTeacher::show(){cout<8、era("test");a.show();cin.get();} 创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类
4、么它和c++的默认提供的构造函数等价的。 构造函数可以带任意多个的形式参数,这一点和普通函数的特性是一样的! 下面我们来看一个带参数的构造函数是如何进行对象的始化操作的。 代码如下:#includeusingnamespacestd;classTeacher{public:Teacher(char*input_name)//有参数的构造函数{name=newchar[10];//name=input_name;//这样赋值是错误的strcpy(name,input_name);}voidshow();prote
5、cted:char*name;};voidTeacher::show(){cout<6、创建一个类对象。 一旦类中有了一个带参数的构造函数而又没无参数构造函数的时候系统将无法创建不带参数的对象,所以上面的代码Teachera; 就是错误的!!! 这里还有一处也要注意://name=input_name;//这样赋值是错误的 因为name指是指向内存堆区的,如果使用name=input_name;会造成指针指向改变不是指向堆区而是指向栈区,导致在后面调用析构函数delete释放堆空间出错!(析构函数的内容我们后面将要介绍) 如果需要调用能够执行就需要再添加一个没有参数的构造函数 对上面的代码改造如下:#inclu7、deusingnamespacestd;classTeacher{public:Teacher(char*input_name){name=newchar[10];//name=input_name;//这样赋值是错误的strcpy(name,input_name);}Teacher()//无参数构造函数,进行函数重载{}voidshow();protected:char*name;};voidTeacher::show(){cout<8、era("test");a.show();cin.get();} 创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类
6、创建一个类对象。 一旦类中有了一个带参数的构造函数而又没无参数构造函数的时候系统将无法创建不带参数的对象,所以上面的代码Teachera; 就是错误的!!! 这里还有一处也要注意://name=input_name;//这样赋值是错误的 因为name指是指向内存堆区的,如果使用name=input_name;会造成指针指向改变不是指向堆区而是指向栈区,导致在后面调用析构函数delete释放堆空间出错!(析构函数的内容我们后面将要介绍) 如果需要调用能够执行就需要再添加一个没有参数的构造函数 对上面的代码改造如下:#inclu
7、deusingnamespacestd;classTeacher{public:Teacher(char*input_name){name=newchar[10];//name=input_name;//这样赋值是错误的strcpy(name,input_name);}Teacher()//无参数构造函数,进行函数重载{}voidshow();protected:char*name;};voidTeacher::show(){cout<8、era("test");a.show();cin.get();} 创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类
8、era("test");a.show();cin.get();} 创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类
此文档下载收益归作者所有