随口一句:若是析构函数的函数头没有给出来,(看看这个类会不会成为基类),若是会成为基类那就必需要把析构函数设置成虚析构函数,若是不会成为基类就随便。能够是虚析构也能够普通的析构函数。数组
2012~2013 秋季学期函数
1.问:复制构造函数中为何首先要将指针x初始化为NULL?与其后面执行的语句有什么关系?this
回答:复制构造函数体中使用了赋值运算符函数,而赋值运算符函数中若x不为NULL,则执行delete[]操做。若不将x初始化为NULL,其值可能不可预知,且可能不为NULL,直接执行delete[]将出错。spa
2.问:为何将运算符函数operator<<重载为友元函数?操作系统
回答:由于运算符函数operator<<是双目运算,并且该函数的第一个操做数不是本类的对象不能将其定义为成员函数,因此重载为友元函数指针
3.问:派生类Derived或RationalNumber类的构造函数中为何要显式地使用冒号语法规则对基类的数据成员进行初始化?对象
回答:由于基类Base没有默认的构造函数内存
2014~2015 秋季学期作用域
1.链表类的深赋值函数io
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.RMB那道题,在有运算符号的时候就输出一个数,其余时候就做为一个rmb对象输入成几元几角几分。(由于rmb这个类并无重载运算符,在作运算的时候要强制类型转换,就转换成了unsigned int (你看有一个强制类型转换函数))
operator unsigned int() const
{ // 类型转换函数,可将RMB类型的对象转换成unsigned int类型数据
return 100*yuan+10*jiao+fen;
}
2.Animal和cat的题目
show函数是一个虚函数,派生类cat里面对于show函数的定义会覆盖前面的animal基类中定义的show函数
可是print函数不是虚函数,因此它是什么类就会调用什么类的print函数
在构造一个派生类的时候须要先派生基类,再派生那个派生类
大功告成!!!吃饺子去咯!
但愿我明天能够考超级高的分!必定要4.0哦!