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