随口一句:如果析构函数的函数头没有给出来,(看看这个类会不会成为基类),如果会成为基类那就必须要把析构函数设置成虚析构函数,如果不会成为基类就随便。可以是虚析构也可以普通的析构函数。
2012~2013 秋季学期
1.问:复制构造函数中为什么首先要将指针x初始化为NULL?与其后面执行的语句有什么关系?
回答:复制构造函数体中使用了赋值运算符函数,而赋值运算符函数中若x不为NULL,则执行delete[]操作。若不将x初始化为NULL,其值可能不可预知,且可能不为NULL,直接执行delete[]将出错。
2.问:为什么将运算符函数operator<<重载为友元函数?
回答:因为运算符函数operator<<是双目运算,而且该函数的第一个操作数不是本类的对象不能将其定义为成员函数,所以重载为友元函数
3.问:派生类Derived或RationalNumber类的构造函数中为什么要显式地使用冒号语法规则对基类的数据成员进行初始化?
回答:因为基类Base没有默认的构造函数
2014~2015 秋季学期
1.链表类的深赋值函数
LinkList & operator=(const LinkList &link)
{
if(⑧ &link == this )
return *this;
FreeList();
Node *p, *q;
for(p=link.head; ⑨ p!=NULL ; p=p->next)
{
if(head==NULL)
head = q = new Node(p->data);
else
{
q->next = new Node(p->data);
q = q->next;
}
}
⑩ q->next = NULL ; (这个的意思就是让尾节点的next变成NULL,防止尾节点变成一个野指针到处乱指到奇怪的东西)
return *this;
}
2.(第三大题的第一小问)
Test *p, t1;
p = new Test(10);
Test t2(2, 3);
cout << *p << '\n'
<< t1 << '\n'
<< t2 << endl;
delete p; //在这里就是delete主动调用析构函数
cout << "退出程序,返回操作系统" << endl;
//系统自动调用析构函数,先构造的后析构,后构造的先析构
2015~2016 秋季学期
1. char & operator[](int index) { return x[index]; } //这里的char &表示返回一个char数组的引用
2.全局对象和自动对象的区别是,全局对象放在静态储存区,而自动对象在栈区。全局变量或是全局对象一般等程序完全结束之后系统自动销毁,而局部变量在超出作用域自动销毁。
3.(题目3.2 结合整个代码来看 这里放不下了)
Test1 x(100); // 创建一个全局对象
void f(Test1 t)
{
Show();
}
int main()
{
Show();
f(x); //在调用f函数 传参数的时候调用了拷贝构造函数 所以num++ sum也加了 但在后面销毁t的时候num-- num和sum又变回原来的样子
Show();
return 0;
}
这里的输出是:
Num = 1 , Sum = 100
Num = 2 , Sum = 200 //出现疑问的地方
Num = 1 , Sum = 100
4.也是3.2这道题,思路差不多 在造a数组的时候拷贝构造了两次
2016~2017
1. 题目3.1当中的b.add().add();
其中add()函数的样子:
ctest add() // 本成员函数为值返回
{
ctest temp(*this);
++a;
return temp;
}
这句话的意思是,先是b调用了add()函数,add()函数调用结束之后把temp析构,返回了一个临时无名变量,后来再西沟一次
2017~2018 秋季学期
1.那个用不同语言打招呼的题目,为什么test0302C(c)用到的是基类的SayHello()和SayByebye()呢?
回答:test0302C是一个值传递的函数,需要用到拷贝构造函数,但是这里没有定义拷贝构造,所以就用基类的默认拷贝构造函数,所以就强制类型转换把c转换成了Language类。
2. 3.3这道题为什么最后的max和min是100和-50呢?
回答:这是因为d,e,f都是拷贝构造函数生成的,没有用自己定义的构造函数,也就没有加入排列max和min的阵营中。
3.用一个长长的数组去填充一个可能没那么长的数组记得重新分配一下内存。
2017直招试卷
1.