1、1 为什么要引入构造函数和析构函数?对象的初始化是指对象数据成员的初始化,在使用对象前,一定要初始化。由于数据成员一般为私有的(private),所以不能直接赋值。对对象初始化有以下两种方法:类中提供一个普通成员函数来初始化,但是会造成使用上的不便(使用对象前必须显式调用该函数)和不安全(未调用初始化函数就使用对象)。当定义对象时,编译程序自动调用构造函数。析构函数的功能是当对象被撤消时,释放该对象占用的内存空间。析构函数的作用与构造函数正好相反,一般情况下,析构函数执行构造函数的逆操作。在对象消亡时,系统将自动调用析构函数,执行一些在对象撤消前必须执行的清理任务。2. 类的公有、私有和保护成
2、员之间的区别是什么? 私有成员 private: 私有成员是在类中被隐藏的部分,它往往是用来描述该类对象属性的一些数据成员,私有成员只能由本类的成员函数或某些特殊说明的函数(如第 4 章讲到的友员函数)访问,而类的外部根本就无法访问,实现了访问权限的有效控制,使数据得到有效的保护,有利于数据的隐藏,使内部数据不能被任意的访问和修改,也不会对该类以外的其余部分造成影响,使模块之间的相互作用被降低到最小。private 成员若处于类声明中的第一部分,可省略关键字 private。 公有成员 public:公有成员对外是完全开放的,公有成员一般是成员函数,它提供了外部程序与类的接口功能,用户通过公有
3、成员访问该类对象中的数据。 保护成员 protected: 只能由该类的成员函数,友元,公有派生类成员函数访问的成员。保护成员与私有成员在一般情况下含义相同,它们的区别体现在类的继承中对产生的新类的影响不同,具体内容将在第 5 章中介绍。缺省访问控制(未指定 private、protected、public 访问权限)时,系统认为是私有 private 成员。3. 什么是拷贝构造函数,它何时被调用?拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同类对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象时系统自动调用它;其形参是本类对象的引用,它的特殊功能是将参数代表
4、的对象逐域拷贝到新创建的对象中。在以下四种情况下系统会自动调用拷贝构造函数: 用类的一个对象去初始化另一个对象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 函数调用时,系统自动调用拷贝构造函数 如果函数的返
5、回值是类的对象,函数调用返回时,调用拷贝构造函数。4. 设计一个计数器类,当建立该类的对象时其初始状态为 0,考虑为计数器定义哪些成员?/ counter.h#ifndef counter_h#define counter_hclass counterprivate:int count;public:counter();void setCount(int i);int getCount();void displayCount();void incrementCount();void decrementCount();counter();#endif/ counter.cpp#include “
6、counter.h“#includecounter:counter()count = 0;void counter:displayCount()cout void main()counter c1;c1.displayCount();c1.setCount(4);c1.displayCount();for(int i=0; iclass Timeint 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 se
7、tMinute(int m)minute = m;void setSecond(int s)second = s;void display()cout #includeusing namespace std;class Studentprivate:int num;char name10;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=
8、c;float sum()return (math+english+computer);float average()return (math+english+computer)/3;int get_reg_num()return num;void print()coutqweazx;if (q =0 )break;stucount+.set_stu_inf(q,we,a,z,x);if(maxa+z+x);else max=a+z+x;aver+=(a+z+x);/ 输出所有学生信息coutq;for( i = 0; i class Stack /定义堆栈类 struct Nodeint c
9、ontent;Node *next; *top;public:Stack() top = NULL; / 构造函数的定义bool push(int i); / 压栈成员函数的声明bool pop(int / 弹栈成员函数的声明;bool Stack:push(int i) / 压栈成员函数的定义 Node *p=new Node;if (p = NULL) cout content = i;p-next = top;top = p;return true;bool Stack:pop(inti = p-content;delete p;return true;void main()Stack
10、st1,st2; / 定义对象 st1 和 st2int x;for(int i=1;i=5;i+)st1.push(i); / 压栈成员函数的调用st2.push(i); / 压栈成员函数的调用cout“stack1:“endl;for(i=1;i=3;i+)st1.pop(x); / 弹栈成员函数的调用coutxendl;st1.push(20);for(i=1;i=4;i+)if(st1.pop(x)coutxendl;elsebreak;cout“stack2:“endl;while(st2.pop(x)coutxendl;顺序栈采用一维数组来实现。 (略)8. 写出下列程序的运行结果:Constructing 22 11Constructing 20 10display:22 11display:20 10Destructing20 10Destructing22 11