为什么要引入构造函数和析构函数汇总

合集下载

c++面向对象程序设计知识点总结

c++面向对象程序设计知识点总结

c++面向对象程序设计知识点总结哇塞!今天咱们就来好好唠唠C++面向对象程序设计的那些知识点!首先,啥是面向对象程序设计呢?这可太重要啦!简单来说,就是把现实世界中的事物,当成一个个对象来处理。

就好比一辆汽车,它有自己的属性,像颜色、型号、速度等等,还有自己的行为,比如启动、加速、刹车。

在C++中,类就是用来定义对象的模板哟!比如说,咱们可以创建一个“汽车类”。

这个类里面包含了汽车的各种属性和方法。

类的成员变量和成员函数,这可是关键中的关键!成员变量就是对象的属性,像汽车的颜色、型号那些。

而成员函数呢,就是对象的行为,比如让汽车加速的函数。

继承,这也是个超级厉害的特性!子类可以继承父类的属性和方法。

比如说,“跑车类”可以继承“汽车类”,然后跑车类就有了汽车类的基本属性和方法,还能有自己独特的属性和方法,像超级快的加速能力!多态性,这简直是魔法!通过虚函数和动态绑定,同一种操作在不同的对象上可以有不同的表现。

比如,同样是“刹车”这个操作,普通汽车和跑车的刹车效果可能就不一样!封装,把类的内部实现细节隐藏起来,只对外提供接口。

这就好比汽车的发动机,咱们不用知道里面具体咋工作的,只要会踩油门就行啦!构造函数和析构函数,这俩兄弟也不能忽视!构造函数在创建对象的时候自动调用,用来初始化对象的状态。

析构函数呢,在对象销毁的时候调用,做一些清理工作。

对象的创建和销毁,这里面也有不少学问!创建对象的时候要分配内存,销毁的时候要释放内存,不然可就会出大问题啦!还有模板,这可是让代码更通用的好东西!可以写一个模板类或者模板函数,能处理不同类型的数据,简直太方便啦!哎呀,C++面向对象程序设计的知识点真是太多太多啦!像友元函数、静态成员、异常处理等等,每一个都很重要!友元函数可以突破类的封装性,访问类的私有成员。

但要小心使用,不然封装就白搞啦!静态成员是属于类本身的,而不是对象的。

比如说,统计创建了多少个对象,就可以用静态成员。

C++期末考试简答题

C++期末考试简答题
continue语句结束本次循环,接着开始判断决定是否继续执行下一次循环;
第三章
1、3-1 C++中的函数是什么?什么叫主调函数,什么叫被调函数,二者之间有什么关系?如何调用一个函数?
解:
一个较为复杂的系统往往需要划分为若干子系统,高级语言中的子程序就是用来实现这种模块划分的。C和C++语言中的子程序就体现为函数。调用其它函数的函数被称为主调函数,被其它函数调用的函数称为被调函数。一个函数很可能既调用别的函数又被另外的函数调用,这样它可能在某一个调用与被调用关系中充当主调函数,而在另一个调用与被调用关系中充当被调函数。
3、5-5什么叫做静态数据成员?它有何特点?
解:
类的静态数据成员是类的数据成员的一种特例,采用static关键字来声明。对于类的普通数据成员,每一个类的对象都拥有一个拷贝,就是说每个对象的同名数据成员可以分别存储不同的数值,这也是保证对象拥有自身区别于其它对象的特征的需要,但是静态数据成员,每个类只要一个拷贝,由所有该类的对象共同维护和使用,这个共同维护、使用也就实现了同一类的不同对象之间的数据共享。
2、6-7什么叫做指针?指针中储存的地址和这个地址中的值有何区别?
解:
指针是一种数据类型,具有指针类型的变量称为指针变量。指针变量存放的是另外一个对象的地址,这个地址中的值就是另一个对象的内容。
3、6-11引用和指针有何区别?何时只能使用指针而不能使用引用?
解:
引用是一个别名,不能为NULL值,不能被重新分配;指针是一个存放地址的变量。当需要对变量重新赋以另外的地址或赋值为NULL时只能使用指针。
调用函数之前先要声明函数原型。按如下形式声明:
类型标识符被调函数名(含类型说明的形参表);

构造函数和析构函数总论

构造函数和析构函数总论

对于相同域中的对象:先构造的后析构,后构造的先 析构。
静态(static)类成员
一、静态数据成员 1、定义: class CTest { public ; static int count ; ┆ }; CTest rect1,rect2,… //定义多个对象 注: 无论生成多少个CTest对象,只有一个count,因此它是由 所有CTest对象共有的。静态数据成员只存储一处,供所有 对象共用。静态数据成员能够实现多个对象的数据共享。
构造函数和析构函数总论
在类中可以定义两个指定功能成员函数: 构造函数 析构函数 一、 构造函数 用来生成对象,可以初始化对象的数据成 员,构造函数在有对象生成时有系统自动调用。
class crectangle { private : int left ; int right ; public : crectangle( int L, int R) //构造函数 {left=L; right=R ;} void getcoord ( int *L , int *R ) {*L=left ; *R = right } };
const对象和const成员函数
①对象定义中加入const,表示该对象为常对象, 常对象中的数据成员为常变量,不能改变该类 中任何数据成员的值,数据成员必须有初值。 常对象用来保护对象中的数据不被修改; ②类中的函数定义中加入const,表示该函数为 常成员函数,只能引用本类中的数据成员,而 不能不能改变它们。常对象只允许调用常函数。 ③类中的数据成员定义中加入const,表示该数据 成员为常数据成员,其值是不能改变的,只能 通过构造函数的成员初始化表对其进行初始化。
二.析构函数
1 、析构函数:用来释放对象,在对象 删除前,用它来做一些清理工作,它在 类对象销毁时自动调用。

C++考试试题重点

C++考试试题重点

一、概念题1.类和对象有什么区别和联系?类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。

类是对某一类对象的抽象,而对象是某一种类的实例。

2.什么是类的实现?将类所有未编写函数体的成员函数在类体外全部编写出来。

3.this指针的概念是什么?类中所有的成员函数(静态成员函数除外)都隐含了第一个参数,这个隐含的第一个参数就是this指针,在成员函数的实现代码中,所有涉及对类的数据成员的操作都隐含为对this指针所指对象的操作。

4.为什么要引入构造函数和析构函数?构造函数的作用是为类对象的数据成员赋初值,构造函数在定义类对象时由系统自动调用;在一个对象死亡或者说退出生存期时,系统会自动调用析构函数,因此可以在析构函数定义中,设置语句释放该对象所占用的一些资源。

5.什么时候需要自定义拷贝构造函数?若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?当有用一个已经存在对象创建一个同类型的新对象的需求时。

当对象含有指针数据成员,并用它初始化同类型的另一个对象时,默认的拷贝构造函数只能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存单元也复制过去。

这样,就可能出现同一内存单元释放两次,导致程序运行出错。

6.什么是堆对象?创建和回收堆对象的方法是什么?堆区用来存放在程序运行期间,根据需要随时建立的变量(对象),建立在堆区的对象称为堆对象,当堆对象不再使用时,应予以删除,回收所占用的动态内存。

创建和回收堆对象的方法是使用new和delete运算符。

7.为什么需要静态数据成员?静态数据成员的定义和初始化方法是什么?定义静态数据成员是为了同一个类的不同对象之间共享公共数据成员;用关键字static可以把数据成员定义成静态数据成员;在定义的类被使用前,要对其中的静态数据成员进行初始化,初始化时不必添加关键字static。

8.什么是静态成员函数?静态成员函数和非静态成员函数有什么区别?用关键字static可以把这成员函数定义成静态成员函数。

构造函数与析构函数

构造函数与析构函数
构造函数与析构函数
1
回想一下变量和函数参数的初始化 变量 定义与赋值结合起来: int number=9902; 函数 应用缺省参数: void add(int a=0, int b=0); 目的 便于编程、保证变量的值不会无意义,减小 程序出错的可能性。 构造函数和析构函数是类中的特殊的成员函数,构 造函数, 创建并初始化类的数据成员。析构函数 , 对象撤消时的清理工作,削除对象,释放内存。
14
// employee的类外定义 employee :: employee () : x (215) // 初始化表 { … } // show()的定义。 void employee :: show() { cout << "\n x的值是:"<< x << endl; } // 主函数 void main() { //生成对象并为x赋予初始值 employee obj; //调用show显示x的值 obj.show(); }
8
//Exanple:为类 Person增加构造函数 #include <string.h> class Person { private: char m_strName[20]; int m_nAge; int m_nSex; public: Person(const char *name,int age,char sex) { strcpy(m_strName,name); m_nAge=age; m_nSex=(sex=='m'?0:1); } void Register(char *Name,int Age,char Sex); void GetName(char *Name); int GetAge(); char GetSex();};

面向对象的C++理论与实践 复习题

面向对象的C++理论与实践 复习题

复习题一、全面复习课程内容和所有平时布置的作业、课堂讲过的例题二、练习下列题型示例。

要求掌握各种基本概念和基本原理,学会灵活应用。

1、简要回答下列问题(1)什么是面向对象的程序设计?(2)什么是对象?它有哪些特征?什么是类?对象与类的关系是什么?(3)什么是消息?如何区分公有消息与私有消息?消息具有什么性质?(4)什么是多态性?在面向对象系统中多态性表现在哪些方面?(5)什么是继承性?继承的作用是什么?(6)C++是如何实现数据封装和信息隐藏的?若类间具有继承关系,则它们之间具有什么特征?(7)为什么要引入构造函数和析构函数?它们各有什么特性?(8)this指针的主要作用是什么?静态成员有哪些特性?(9)使用内部(内置)函数的优点是什么?(10)假设在程序中已经声明了类point,并建立了其对象p1和p4。

请回答以下几个语句有什么区别?①point p2,p3; ②point p2=p1; ③point p2(p1); ④p4=p1;(11)友元函数有什么作用?(12)用成员函数重载运算符和用友元重载运算符,在定义和使用上有什么不同?(13)什么是重载?函数重载有几种表现形式?(14)为什么要引入引用概念,在程序设计中它经常被用在什么场合?(15)简述引用与指针的异同。

(16)派生有几种方式,每种方式中派生类对基类成员的继承性如何?(17)派生类构造函数和析构函数的构造规则是什么?执行顺序怎样?(18)什么是多继承?多继承时,构造函数和析构函数执行顺序是怎样的?(19)在C++中的何种情况下要引入虚基类?虚基类的构造函数的调用顺序是如何规定的?(20)保护段成员与公有段成员有何差别?在派生类中如何继承?(21)什么是虚函数?函数重载与虚函数有哪些异同?(22)什么是纯虚函数?什么是抽象类?(23)在什么情况下要引入抽象类?抽象类有什么特点?(24)什么是多重继承的名字冲突?怎样解决多重继承的名字冲突?(25)C++中多态性体现在哪几方面?(26)为什么使用模板?函数模板声明的一般形式是什么?(27)函数模板与同名的非模板函数重载时,调用的顺序是怎样的?2、填空(1)面向对象的程序设计具有等特征。

C语言里面构造函数和析构函数的运用办法

C语言里面构造函数和析构函数的运用办法

C语言里面构造函数和析构函数的运用办法C语言里面构造函数和析构函数的运用办法摘要:构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误。

本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项。

关键字:构造函数;析构函数;垃圾回收器;非托管资源;托管资源一.构造函数与析构函数的原理作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性。

C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙。

但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是冰山一角。

级别高的错误通常隐藏得很深,不容易发现。

根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。

微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。

当对象被创建时,构造函数被自动执行。

当对象消亡时,析构函数被自动执行。

这样就不用担心忘记对象的初始化和清除工作。

二.构造函数在C#中的运用构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。

它的命名方法既简单又合理:让构造函数与类同名。

除了名字外,构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。

如果它有返回值类型,那么编译器将不知所措。

在你可以访问一个类的方法、属性或任何其它东西之前,第一条执行的语句是包含有相应类的构造函数。

甚至你自己不写一个构造函数,也会有一个缺省构造函数提供给你。

class TestClass{public TestClass(): base() {} // 由CLR提供}下面列举了几种类型的构造函数1)缺省构造函数class TestClass{public TestClass(): base() {}}上面已介绍,它由系统(CLR)提供。

构造函数和析构函数的作用

构造函数和析构函数的作用

构造函数和析构函数的作用构造函数是一种特殊的成员函数,它没有返回类型,与类名相同,并且在创建对象时自动调用。

构造函数用于初始化对象的成员变量或执行一些必要的操作,确保对象的有效状态。

构造函数的主要作用如下:1.初始化成员变量构造函数用于初始化对象的成员变量。

可以通过构造函数对成员变量进行赋值操作,设置对象的初始状态。

在构造函数中可以使用this指针来访问对象的成员变量,通过this指针可以明确地指出当前对象。

2.为对象分配内存空间构造函数还负责为对象分配内存空间。

在创建对象时,构造函数会根据类的定义动态分配内存空间,保证对象的有效性,避免对象的成员变量冲突或访问越界等问题。

3.执行必要的操作构造函数还可以执行一些必要的操作,如连接数据库、初始化指针、打开文件等。

这些操作可以确保对象在创建时处于正确的状态,便于后续的使用。

4.支持函数重载构造函数支持函数重载,即在同一个类中可以定义多个构造函数,根据参数的不同进行区分。

这样可以方便地根据需要创建不同类型或不同初始状态的对象。

5.构造函数链在一些情况下,可以通过构造函数链来避免重复的代码。

构造函数链是指一个构造函数调用另一个构造函数来完成一部分初始化工作。

通过构造函数链,可以简化代码,并确保对象被正确初始化。

总之,构造函数的主要作用是为对象分配内存空间、初始化成员变量、执行必要的操作,确保对象的有效状态。

析构函数是与构造函数对应的一种特殊成员函数,用于清理对象内的资源并进行析构操作。

析构函数在对象销毁时自动调用,与构造函数相反。

析构函数的主要作用如下:1.释放动态分配的内存空间析构函数负责释放动态分配的内存空间,确保对象销毁时资源能够被正确释放。

如果在构造函数中动态分配了内存,应该在析构函数中释放,避免内存泄漏。

2.断开与外部资源的连接析构函数还可以断开与外部资源的连接,如关闭数据库连接、关闭文件等。

这样可以避免资源的浪费和异常。

3.执行必要的清理操作析构函数还可以执行一些必要的清理操作,如释放锁、关闭线程等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.为什么要引入构造函数和析构函数?对象的初始化是指对象数据成员的初始化,在使用对象前,一定要初始化。

由于数据成员一般为私有的(private),所以不能直接赋值。

对对象初始化有以下两种方法:类中提供一个普通成员函数来初始化,但是会造成使用上的不便(使用对象前必须显式调用该函数)和不安全(未调用初始化函数就使用对象)。

当定义对象时,编译程序自动调用构造函数。

析构函数的功能是当对象被撤消时,释放该对象占用的内存空间。

析构函数的作用与构造函数正好相反,一般情况下,析构函数执行构造函数的逆操作。

在对象消亡时,系统将自动调用析构函数,执行一些在对象撤消前必须执行的清理任务。

2. 类的公有、私有和保护成员之间的区别是什么?①私有成员private: 私有成员是在类中被隐藏的部分,它往往是用来描述该类对象属性的一些数据成员,私有成员只能由本类的成员函数或某些特殊说明的函数(如第4章讲到的友员函数)访问,而类的外部根本就无法访问,实现了访问权限的有效控制,使数据得到有效的保护,有利于数据的隐藏,使内部数据不能被任意的访问和修改,也不会对该类以外的其余部分造成影响,使模块之间的相互作用被降低到最小。

private成员若处于类声明中的第一部分,可省略关键字private。

②公有成员public:公有成员对外是完全开放的,公有成员一般是成员函数,它提供了外部程序与类的接口功能,用户通过公有成员访问该类对象中的数据。

③保护成员protected: 只能由该类的成员函数,友元,公有派生类成员函数访问的成员。

保护成员与私有成员在一般情况下含义相同,它们的区别体现在类的继承中对产生的新类的影响不同,具体内容将在第5章中介绍。

缺省访问控制(未指定private、protected、public访问权限)时,系统认为是私有private 成员。

3. 什么是拷贝构造函数,它何时被调用?拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同类对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象时系统自动调用它;其形参是本类对象的引用,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中。

在以下四种情况下系统会自动调用拷贝构造函数:①用类的一个对象去初始化另一个对象cat cat1;cat cat2(cat1); // 创建 cat2时系统自动调用拷贝构造函数,// 用cat1初始化cat2。

②用类的一个对象去初始化另一个对象时的另外一种形式Cat cat2=cat1; // 注意并非cat cat1,cat2; cat2=cat1;③对象作为函数参数传递时,调用拷贝构造函数。

f(cat a){ } // 定义f函数,形参为cat类对象cat b; // 定义对象bf(b); // 进行f函数调用时,系统自动调用拷贝构造函数④如果函数的返回值是类的对象,函数调用返回时,调用拷贝构造函数。

4. 设计一个计数器类,当建立该类的对象时其初始状态为0,考虑为计数器定义哪些成员?// counter.h#ifndef counter_h#define counter_hclass counter{private:int count;public:counter();void setCount(int i);int getCount();void displayCount();void incrementCount();void decrementCount();~counter(){}};#endif// counter.cpp#include "counter.h"#include<iostream.h>counter::counter(){count = 0;}void counter::displayCount(){ cout << count << endl;}int counter::getCount(){return count;}void counter::setCount(int i){ count = i;}void counter::incrementCount(){ count++;}void counter::decrementCount(){ count--;}// MAIN.CPP#include "counter.h"#include<iostream.h>void main(){counter c1;c1.displayCount();c1.setCount(4);c1.displayCount();for(int i=0; i<=10;i++){c1.incrementCount();c1.displayCount();}}5. 定义一个时间类,能提供和设置由时、分、秒组成的时间,并编写出应用程序,定义时间对象,设置时间,输出该对象提供的时间。

#include <iostream.h>class Time{int hour,minute,second;public:Time(int h=0,int m=0, int s=0){hour = h;minute = m;second = s;}void setHour(int h){hour = h;}void setMinute(int m){minute = m;}void setSecond(int s){second = s;}void display(){cout << hour << ": " << minute << ": " << second <<endl;}};void main(){Time t;t.display();t.setHour(13);t.setMinute(15);t.setSecond(30);t.display();}6.设计一个学生类student,它具有的私有数据成员是:注册号、姓名、数学、英语、计算机成绩;具有的公有成员函数是:求三门课总成绩的函数sum;求三门课平均成绩的函数average;显示学生数据信息的函数print;获取学生注册号的函数get_reg_num;设置学生数据信息的函数set_stu_inf。

编制主函数,说明一个student类对象的数组并进行全班学生信息的输入与设置,而后求出每一学生的总成绩、平均成绩、全班学生总成绩最高分、全班学生总平均分,并在输入一个注册号后,输出该学生有关的全部数据信息。

#include<iostream>#include<string>using namespace std;class Student{private:int num;char name[10];float math;float english;float computer;public:void set_stu_inf(int n,char *ch,float m,float e,float c){num=n; strcpy(name,ch); math=m; english=e; computer=c;}float sum(){return (math+english+computer);}float average(){return (math+english+computer)/3;}int get_reg_num(){return num;}void print(){cout<<"学号:"<<num<<endl<<"姓名:"<<name<<endl<<"数学:"<<math<<endl<<"英语:"<<english<<endl<<"计算机:"<<computer<<endl<<"总分:"<<sum()<<endl<<"平均分:"<<average()<<endl;}};void main(){Student stu[50];int i,q,a,z,x,max=0,aver=0; //i为循环变量,q:学号;a:数学//成绩; z:英语成绩; x:计算机成绩int count = 0; //表示学生人数char* we=new char[10];// 输入学生信息for(;;){cout<<"请输入学生的学号、姓名、数学成绩、英语成绩、计算机成绩:(若输入的学号为0则表示退出)" << endl;cin>>q>>we>>a>>z>>x;if (q ==0 )break;stu[count++].set_stu_inf(q,we,a,z,x);if(max>a+z+x);else max=a+z+x;aver+=(a+z+x);}// 输出所有学生信息cout<<"学生信息为:"<<endl<<endl;for( i = 0; i < count; i++){stu[i].print();cout<<endl;}cout<<"全班学生总成绩最高分为"<<max<<endl<<"全班学生总平均分为"<<aver/3<<endl<<endl;cout<<"请输入要查的学生的学号:"<<endl;cin>>q;for( i = 0; i < count; i++){if (q==stu[i].get_reg_num()){cout<<"此学生信息为:"<<endl;stu[i].print();break;}}if (i==count)cout<<"查无此人"<<endl;}7. 模拟栈模型的操作,考虑顺序栈和链栈两种形式。

相关文档
最新文档