10构造函数和析构函数
- 格式:ppt
- 大小:477.50 KB
- 文档页数:53
结构体构造函数与析构函数结构体是C++程序开发中常用的一种数据类型,可以将不同的数据类型封装在一个结构体中,以便于更好地组织和管理数据,提高程序的可读性和可维护性。
在结构体中,构造函数和析构函数是很重要的成员函数之一,它们分别用于完成结构体对象的初始化和销毁操作,下面我们来具体了解一下。
一、什么是结构体构造函数?结构体构造函数是一种特殊的成员函数,用于在定义结构体对象时自动执行,来完成一些对象的初始化操作。
它的特点如下:1、构造函数名称与结构体名称一致。
2、不能有返回值,包括void也不行。
3、可以有参数列表,但不能有默认参数。
4、可以有多个重载的构造函数。
5、如果没有显式定义构造函数,则编译器会自动生成默认构造函数。
例如:struct Student{int num;char name[20];float score;Student()//默认构造函数{num = 0;strcpy(name, "No name");score = 0.0;cout << "Constructor is called." << endl;}Student(int n, char na[], float s)//重载构造函数{num = n;strcpy(name, na);score = s;cout << "Another constructor is called." << endl;}};int main(){Student s1;//调用默认构造函数Student s2(1001, "Jack", 80.5);//调用有参构造函数return 0;}在上面的代码中,我们定义了一个名为Student的结构体,它有两个构造函数:默认构造函数和重载构造函数。
在main函数中,我们分别定义了两个结构体对象s1和s2,并使用不同的方式调用了它们的构造函数。
1.为什么要引入构造函数和析构函数?对象的初始化是指对象数据成员的初始化,在使用对象前,一定要初始化。
由于数据成员一般为私有的(private),所以不能直接赋值。
对对象初始化有以下两种方法:类中提供一个普通成员函数来初始化,但是会造成使用上的不便(使用对象前必须显式调用该函数)和不安全(未调用初始化函数就使用对象)。
当定义对象时,编译程序自动调用构造函数。
析构函数的功能是当对象被撤消时,释放该对象占用的内存空间。
析构函数的作用与构造函数正好相反,一般情况下,析构函数执行构造函数的逆操作。
在对象消亡时,系统将自动调用析构函数,执行一些在对象撤消前必须执行的清理任务。
2. 类的公有、私有和保护成员之间的区别是什么?①私有成员private: 私有成员是在类中被隐藏的部分,它往往是用来描述该类对象属性的一些数据成员,私有成员只能由本类的成员函数或某些特殊说明的函数(如第4章讲到的友员函数)访问,而类的外部根本就无法访问,实现了访问权限的有效控制,使数据得到有效的保护,有利于数据的隐藏,使内部数据不能被任意的访问和修改,也不会对该类以外的其余部分造成影响,使模块之间的相互作用被降低到最小。
private成员若处于类声明中的第一部分,可省略关键字private。
②公有成员public:公有成员对外是完全开放的,公有成员一般是成员函数,它提供了外部程序与类的接口功能,用户通过公有成员访问该类对象中的数据。
③保护成员protected: 只能由该类的成员函数,友元,公有派生类成员函数访问的成员。
保护成员与私有成员在一般情况下含义相同,它们的区别体现在类的继承中对产生的新类的影响不同,具体内容将在第5章中介绍。
缺省访问控制(未指定private、protected、public访问权限)时,系统认为是私有private 成员。
3. 什么是拷贝构造函数,它何时被调用?拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同类对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象时系统自动调用它;其形参是本类对象的引用,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中。
编写个人信息类的构造函数与析构函数本文将介绍构造函数和析构函数的概念及其在个人信息类中的应用。
构造函数:构造函数是一种特殊的成员函数,它在对象被创建时被自动调用,用于初始化类的数据成员。
构造函数所执行的操作包括:为类的成员变量赋初值,为对象分配必要的资源等。
构造函数的函数名必须与类名相同,无返回值。
构造函数可以定义默认参数、重载多个版本等。
对于一个个人信息类,构造函数可能如下所示:```C++class PersonalInfo {public:PersonalInfo(); //默认构造函数PersonalInfo(string name, int age, string id); //带参数的构造函数~PersonalInfo(); //析构函数private:string m_name;int m_age;string m_id;};PersonalInfo::PersonalInfo() {m_name = "";m_age = 0;m_id = "";}```这里定义了两个构造函数,一个是默认构造函数,一个是带参数的构造函数。
默认构造函数用于在对象创建时初始化对象的数据成员。
带参数的构造函数用于在对象创建时直接初始化数据成员,避免了在后续使用中再次进行一遍初始化的麻烦。
如果需要设置默认值,那么可以通过在类中声明或定义该构造函数来实现。
用于设置姓名为“张三”,年龄为18岁,身份证号为“123456”的默认构造函数可以如下所示:析构函数:析构函数是一种特殊的成员函数,它在对象被销毁时被自动调用,用于释放对象占用的资源。
如果在构造函数中为对象分配了一些资源(如用new动态分配内存),那么在析构函数中需要释放这些资源(如用delete释放内存)。
和构造函数不同,析构函数的函数名必须与类名相同,但需要在函数名前面加上一个 ~ 符号,表示析构函数。
析构函数没有形参和返回值。
C++_构造函数与析构函数构造函数与析构函数1 构造函数1.1 构造函数具有⼀些特殊的性质1.2 定义构造函数的⼀般形式1.3 利⽤构造函数创建对象2 成员初始化表3 缺省参数的构造函数4 重载构造函数5 拷贝构造函数5.1 ⾃定义拷贝构造函数5.2 缺省的拷贝构造函数5.3 调⽤拷贝构造函数的三种情况5.4 浅拷贝和深拷贝6 析构函数7 调⽤构造函数和析构函数的顺序8 对象的⽣存期构造函数和析构函数都是类的成员函数,但它们都是特殊的成员函数,执⾏特殊的功能,不⽤调⽤便⾃动执⾏,⽽且这些函数的名字与类的名字有关。
C++语⾔中有⼀些成员函数性质是特殊的,这些成员函数负责对象的建⽴、删除。
这些函数的特殊性在于可以由编译器⾃动地隐含调⽤,其中⼀些函数调⽤格式采⽤运算符函数重载的语法。
C++引进⼀个⾃动完成对象初始化过程的机制,这就是类的构造函数。
对象的初始化1. 数据成员是不能在声明类时初始化2. 类型对象的初始化⽅法:1. 调⽤对外接⼝(public成员函数)实现:声明类→定义对象→调⽤接⼝给成员赋值2. 应⽤构造函数(constructor)实现:声明类→定义对象→同时给成员赋值1. 构造函数构造函数是⼀种特殊的成员函数,它主要⽤于为对象分配空间,进⾏初始化。
1.1 构造函数具有⼀些特殊的性质:(1) 构造函数的名字必须与类名相同。
(2) 构造函数可以有任意类型的参数,但不能指定返回类型。
它有隐含的返回值,该值由系统内部使⽤。
(3) 构造函数是特殊的成员函数,函数体可写在类体内,也可写在类体外。
(4) 构造函数可以重载,即⼀个类中可以定义多个参数个数或参数类型不同的构造函数。
构造函数是不能继承(5) 构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地调⽤,它是在定义对象的同时被调⽤的。
(6) 在声明类时如果没有定义类的构造函数,编译系统就会在编译时⾃动⽣成⼀个默认形式的构造函数,(7) 默认构造函数是构造对象时不提供参数的构造函数。
精品文档,知识共享!〔校精品〕面向对象程序设计(2007053) > 模拟试题模拟试题试题1一、 选择题(每题2分,共30分)1.C++对C 语言作了很多改进,下列描述中( )使得C 语言发生了质变,从面向过程变成了面向对象。
A 、增加了一些新的运算符;B 、允许函数重载,并允许设置缺省参数;C 、规定函数说明必须用原型;D 、引进了类和对象的概念; 2.下列描述中,( )是错误的。
A 、内联函数主要解决程序的运行效率问题;B 、内联函数的定义必须出现在内联函数第一次被调用之前;C 、内联函数中可以包括各种语句;D 、对内联函数不可以进行异常接口声明;3.在C++中,关于下列设置缺省参数值的描述中,( )是正确的。
A 、不允许设置缺省参数值;B 、在指定了缺省值的参数右边,不能出现没有指定缺省值的参数;C 、只能在函数的定义性声明中指定参数的缺省值;D 、设置缺省参数值时,必须全部都设置; 4.( )不是构造函数的特征。
A 、构造函数的函数名与类名相同; B 、构造函数可以重载;C 、构造函数可以设置缺省参数;D 、构造函数必须指定类型说明。
5.( )是析构函数的特征。
A 、析构函数可以有一个或多个参数;B 、析构函数名与类名不同;C 、析构函数的定义只能在类体内;D 、一个类中只能定义一个析构函数;6.关于成员函数特征的下列描述中,( )是错误的。
A 、成员函数一定是内联函数; B 、成员函数可以重载;C 、成员函数可以设置缺省参数值;D 、成员函数可以是静态的;精品文档,知识共享!7.下列静态数据成员的特性中,()是错误的。
A、说明静态数据成员时前边要加修饰符static;B、静态数据成员要在类体外进行初始化;C、静态数据成员不是所有对象所共用的;D、引用静态数据成员时,要在其名称前加<类名>和作用域运算符;8.友元的作用是()。
A、提高程序的运用效率;B、加强类的封装性;C、实现数据的隐藏性;D、增加成员函数的种类;9.关于new运算符的下列描述中,()是错误的。
一、判断题(每题1分,共10 分)()1﹒在程序中,变量定义语句可以出现在程序的任何位置。
()2﹒说明函数原型时,必须指明每个参数的类型和名字,以及返回值类型。
()3﹒说明函数原型时,形参列表中具有缺省值的形参的右边的形参数必须都具有缺省值。
()4﹒声明和定义重载函数时,如果函数的形参完全相同,而函数的类型不同,则会引起歧义性错误。
()5﹒指针变量可以在定义时初始化,但初始化的值只能是该指针类型所指对象的地址值或NULL。
()6﹒用引用传递函数参数,将在函数作用域内直接使用变量或对象。
()7﹒基类中被说明为protected的成员,不允许其他的函数访问,但其派生类的成员函数可访问。
()8﹒若类B某成员函数定义为另一个类A的友元,则A类的所有成员函数可以直接访问类B的所有成员。
()9﹒构造函数和析构函数都可以被重载,其中析构函数还可能被定义为虚函数。
()10﹒指向常对象的指针往往用作函数的参数,目的是在保护形参指针所指对象,使它在函数执行过程中不被修改。
二、填空题(每空0.5 分,共10 分)1.对象的封装可以理解为:⑴将有关的和封装在一个对象中,形成一个基本单位,对象之间相互独立,互不干扰。
⑵将对象一部分属性和功能设置为,使之受到保护,不允许其它对象访问它们。
⑶把它的一部分属性和功能设置为,作为,以便与外界联系,接收外界消息。
2.一个类有个析构函数。
析构函数不能具有和,但声明为虚函数。
3.在类定义中使用关键字static说明的数据成员被称为数据成员。
它的特征是不管该类创建了多少个对象,而该数据成员只有一个,被该类的所有对象。
4.如果需要在派生类中访问基类的私有成员可以通过以下两种方法实现:⑴在基类中增加将派生类需要访问的私有成员声明为。
⑵将需要访问基类私有成员的派生类声明为基类的。
5.重载输入运算符>>时,其运算符函数的返回值类型应当是,第一操作参数类型也应当是,而第二操作参数应是输入类型的。
C++程序设计习题集上机题:先定义“高度”类Hight 和“圆”类Circle,再由Hight和Circle多重派生出“圆柱体”类Cylinder。
在主函数中定义一个圆柱体对象,调用成员函数求出圆柱体的体积和表面积。
第一部分:一.选择填空题1.类成员缺省的访问特征是_C_,结构体缺省的访问权限是__B_.A. protectedB. publicC. privateD. friend 2.下列关于类的成员的访问特征的描述中,正确的___A.必须首先说明具有私有特征的成员B.数据成员必须说明成私有的,成员函数必须说明成私有的C.每个成员前都必须有标明访问特性的关键字D.在同一类中,说明访问特性的关键字可以多次使用3.关于类和对象,下列说法不正确的是___A. 类与对象的关系类似于数据类型与变量的关系B.对象是类的一个实例C.任何一个对象必定属于一个特定的类D.一个类只能有一个对象4.关于类的一个成员函数,下列说法中正确的是()A.必须在类内定义B. 一定是内联函数C.不可以重载D.可以设置参数的缺省植5.以下不可以作为类的成员的是()A. 自身类对象的指针B. 自身类的对象C.自身类对象的引用D. 另一个类对象的引用6.已知一个类,类名为A,可以定义A类的对象或定义A类的指针,下列一定不正确的形式为____A. A a1B. A a2 ( 16 )C. A A3( )D. A *P= new A7. 已知一个类COMPLEX,有下述两行:Complex c ; //AComplex c() //B以下描述中错误的是___A. A行定义了一个对象,并调用缺省的构造函数B.B行定义了一个对象,并调用缺省的构造函数C. B行是一个函数的原型说明,函数名为C,函数没有参数,返回值类型是ComplexD. A行和B行两行的意义不一样8.设有下列对象定义;class A{public :int a ,b ;} a1= {1,2}, a2 ,a3 ;class{public :int a,b;}a4 ;则以下正确的定义或赋值形式是___A. a3=a2=a1;B. a4=a1;C. A *p=&a4;D. A &re=a49. 下列描述中, ___不是构造函数的特征A. 构造函数可以重载B.必须显示为类定义一个构造函数C. 无须为构造函数指定返回值类型D. 构造函数在产生对象时由系统自己调用10.下列有关析构函数的描述中,正确的是___A. 析构函数的定义只能在类体内B. 析构函数可以有一个或多个参数C. 析构函数是在撤消对象时,系统自动调用的D. 析构函数可以重载11.以下关于构造函数和析构函数的描述中错误的是___A. 用户不定义缺省的构造函数,则系统自动生成一个缺省的构造函数B. 若用户不定义拷贝的构造函数,则系统自动生成一个拷贝的构造函数C. 若用户不定义析构函数,则系统自动生成一个析构函数D. 以上A错误,而B,C正确12.定义复数类如下;class Complex{ double real ,image ;public:Complex (double r=0 ,double i=0 ) {real =r ; image =i ;}Complex (Complex &c) {real=c.real ; image=c .image ;} };若有Complex c1; //AComplex c2(3,5); //BComplex c3(c2); //Cc2=c1; //D则下列描述中正确的是___A. C行和D行均调用了拷贝构造函数B.C行调用了拷贝构造函数C. B行调用了拷贝构造函数D. A行调用了拷贝构造函数13. class A{int x, int y ;public ;A (int a, int b ) {x=a;y=b;}void show(){cout<<x<void set(int a,int b){x=a;y=b;}};void main(){A obj;obj.set(3,5);obj.show();}对上述过程段,以下说法中,正确的是___A.编译时报错,程序无法运行B.编译时无错,运行正常,输出3,5C.编译无错,运行时报错D.编译时报警告错,但运行正常,输出3,514.在下列程序中,C类的数据成员中有一个A 类对象和一个B类对象。