C++自问自答
因为:对虚函数的调用是通过虚指针+偏移地址构成,由于对虚函数的调用都是通过这种方式,所以对同一个虚函数的偏移值就必须相同。
2.为防止对象切片有什么办法?
可以将基类定义为纯虚类
3.为什么构造函数里面的虚机制不起作用?
a.如果构造函数调用层次上,中间构造函数调用的虚函数属于派生类,由于派生类为初始化完成,所以会有问题。
b.调用层次上的每一个构造函数,都会使虚指针指向该构造函数所属的类的虚表,而对象最终的虚指针是由最后调用的构造函数决定(辈分最小的类),如果在中间层次的构造函数调用虚函数,由于当前构造函数设置的虚指针是指向这个类的虚表,所以调用的虚函数还是自己的函数。
4.为什么纯虚析构函数必须有函数体?
因为,基类的析构函数总会被子类的析构函数调用,如果没有函数体,就不知道该怎么析构一个纯虚类。
5.如果一个派生类没有重定义基类的纯虚函数,会发生什么?
该派生类不能实例化。
6.为什么在析构函数中的虚机制不起作用。
因为虚函数归属的类可能已经被删除。
7.为什么在使用dynamic_cast时需要格外小心。
因为dynamic_cast用来做向下类型转换,操作结果不一定总是成功的,在失败的情况下返回的指针值是零,如果继续使用会coredump.
8.为什么对不带有虚函数的类层次执行向下类型转换,使用static_cast比dynamic_cast好
因为,dynamic_cast会使用虚表里面的类型信息,所以不合理,就算没有虚表,额外的调用会导致效率比较低。
9.为什么头文件的规则:不要把分配存储单元的东西放到头文件 ?
分配存储单元必须指定一个名字,二头文件会被多次包括,如果没有使用排重宏,则会造成多次定义的错误,另一方面就算是有排重宏,由于多个单元可见,怎么协调和同步访问该块存储也是一个问题。
10.c语言的setjump和longjump在c++中有什么问题?
a.保存点和返回点紧耦合
b.不会调用析构函数。试想如果析构函数里面有关闭文件,关闭网络连接,释放内存等操作。
11.c++的异常机制有什么好处?
将业务逻辑代码和错误处理代码解耦,使代码结构清晰,易理解。
12.为什么类型转换构造函数在异常处理机制中不工作?
????,也许是因为异常处理器需要的是更原始,更真实,更具体的信息,如果发生转换这些信息很可能打折扣。
13. catch(...)存在的意义是什么?
释放资源本层,配合不带参数的throw可以将异常完整的传递到上一级,上一级可以继续获取异常信息进行处理。
14.如果被抛出的异常对象,析构函数会抛出异常,会发生什么?
本层处理器将不会处理该异常,如果没有上一层处理器,则terminate会被调用;如果有上一层处理器,上层可以 捕获这个异常,但是这种情况被认为是糟糕的设计或编码。
15.如果构造函数里边会抛出异常应该怎么做,因为析构函数不会被调用?
a.可以在构造函数里边进行异常捕获用于释放资源!
b.也可以将需要释放资源的指针封装成对象,然后将这些对象作为成员变量放在类里面,因为成员变量是对象,所以会在构造函数之前调用其构造函数,所以如果这个时候抛出了异常那么栈反解的时候就会把已经成功构造的给释放掉。
{
T x;
istringstream inStr(str);
inStr>>x;
return x;
}
template <class T> string toString(const T & t)
{
ostringstream ostr;
ostr<<t;
return ostr.str();
{
istringstream iStrDoub(strDouble);
iStrDoub>>pre>>aft;
}
.png)
.png)
.png)
.png)
.png)
.png)
using namespace std;
//牛奶类
class Milk
{
public:
friend ostream & operator << (ostream & os,const Milk &)
{
return os<<"Milk";
}
};
//压缩牛奶类
class CondensedMilk
{
public:
friend ostream & operator << (ostream & os,const CondensedMilk &)
{
return os<<"CondensedMilk";
}
};
//蜂蜜类
class Honey
{
friend ostream & operator<<(ostream & os,const Honey &)
{
return os<<"Honey";
}
};
// 饼干类
class Cookies
{
friend ostream & operator<<(ostream & os,const Cookies &)
{
return os<<"Cookies";
}
};
//定义几个访客类
//熊类
class Bear
{
public:
friend ostream & operator<<(ostream & os,const Bear&)
{
return os<<"Big bear";
}
};
//小孩类
class Boy
{
public:
friend ostream & operator << (ostream & os ,const Boy &)
{
return os<<"Little boy";
}
};
//主要traits模板(空模板可以持有所有普通类型)
template <class Guest> class GuestTraits;
//特化的traits类
template<> class GuestTraits<Bear>
{
public:
typedef CondensedMilk beverage_type;
typedef Honey snack_type;
};
template<> class GuestTraits<Boy>
{
public:
typedef Milk beverage_type;
typedef Cookies snack_type;
};
class MixedUpTraits
{
public:
typedef Milk beverage_type;
typedef Honey snack_type;
};
//驱动类
template<class Guest,class traits=GuestTraits<Guest> >
class BearCorner
{
Guest theGuest;
typedef typename traits::beverage_type beverage_type;
typedef typename traits::snack_type snack_type;
beverage_type bev;
snack_type snack;
public:
BearCorner(const Guest & g):theGuest(g){}
void entertain()
{
cout<<"Entertaining "<<theGuest
<< " serving "<<bev
<< " and "<<snack<<endl;
}
};
int main(int argv,char ** args, char ** env)
{
Boy boy;
Bear bear;
BearCorner<Boy> bc1(boy);
bc1.entertain();
BearCorner<Bear> bc2(bear);
bc2.entertain();
BearCorner<Boy,MixedUpTraits> bc3(boy);
bc3.entertain();
return 0;
using namespace std;
template<class T>
class ObjCount
{
static int cnt;
public:
ObjCount(){++cnt;}
ObjCount(const ObjCount<T> & cnt){++cnt;}
~ObjCount(){--cnt;}
static int getCount(){return cnt;}
};
template<class T> int ObjCount<T>::cnt=0;
{
TestCnt1 t11,t12;
TestCnt2 t21,t22;
cout<<"TestCnt1::getCount="<<TestCnt1::getCount()<<endl;
cout<<"TestCnt2::getCount="<<TestCnt2::getCount()<<endl;
return 0;
C++自问自答的更多相关文章
- [python]自问自答:python -m参数?
python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...
- 自问自答之VR遐想
先让我组织一下语言,作为表达能力超弱的战五渣来讲,归纳总结什么的最要命了. 我可以给你分析个1到N条出来,但是一般来讲没什么顺序,想到什么就说什么.而且我属于线性思维,有一个引子就可以按着话头一步步发 ...
- [python]自问自答:python -m参数? (转)
python -m xxx.py 作用是:把xxx.py文件当做模块启动但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...
- [python]自问自答:python -m参数? (转) ( python2.7 版本 )
原文地址: http://www.cnblogs.com/xueweihan/p/5118222.html python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当 ...
- css自问自答(二)
css自问自答(二) 7.掌握定位的一些属性 position 和 display 属性,以及如何浮动(float)和清除(clear)元素,z-index属性 三个属性控制: position 属性 ...
- css自问自答(一)
css自问自答(一) 1.块级元素和行内元素特性与区别? 块级:display:block <div>.<p>.<h1>...<h6>.<ol&g ...
- vue 源码自问自答-响应式原理
vue 源码自问自答-响应式原理 最近看了 Vue 源码和源码分析类的文章,感觉明白了很多,但是仔细想想却说不出个所以然. 所以打算把自己掌握的知识,试着组织成自己的语言表达出来 不打算平铺直叙的写清 ...
- 区块链自问自答 day1
区块链自问自答 day1 简要介绍区块链是什么? 区块链(Blockchain)是一种对等网络下的分布式数据库系统 数据结构中的单向链表是通过每个节点包含一个节点的指针实现"链" ...
- 区块链自问自答 day2
区块链自问自答 day2 区块链的自治性是如何达成的?为什么能够在去信任的环境下自由安全地交换数据? 区块链中有众多的节点,包含了恶意节点.故障节点.正常节点,想要这些节点共同做出一致的决定就需要 ...
- golang 数组的一些自问自答
所有代码基于Go-1.17.一些研究Go数组的自问自答,可以考虑作为面试题. 问题:静态存储区是什么?和堆/栈有什么区别? 回答: 可以参考下列图 堆上存放new产生的大块内存 栈上存放的是程序运行的 ...
随机推荐
- ACM水题
ACM小白...非常费劲儿的学习中,我觉得目前我能做出来的都可以划分在水题的范围中...不断做,不断总结,随时更新 POJ: 1004 Financial Management 求平均值 杭电OJ: ...
- .net RPC框架选型
近期开始研究分布式架构,会涉及到一个最核心的组件:RPC(Remote Procedure Call Protocol).这个东西的稳定性与性能,直接决定了分布式架构系统的好坏.RPC技术,我们的产品 ...
- CodeSmith操作Access时字段的排序问题
最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致. 首先在ACCESS数据库中建一个测试表Test,并添加ID.Na ...
- c++基础 explicit
c++的构造函数也定义了一个隐式转换 explicit只对构造函数起作用,用来抑制隐式转换 看一个小例子 新建一个头文件 #ifndef CMYSTRING_H #define CMYSTRING_H ...
- 如何在 ie6 中使用 "localStorage"
好吧,我只是个标题党,ie6 下根本无法使用跟 h5 沾边的 localStorage.今天要向大家介绍的是 ie 特有的 userData 的存储方式,并且对它进行封装,使得不支持 localSto ...
- 中国式IT的项目
这篇文章用来总结一下2013,同时也分享一下我对中国IT项目现状的一些看法. 我先从项目说起.这里的项目主要是指的软件开发项目.我们分别从项目中的甲方和乙方谈谈,看看这两者对于项目.对应IT的认识和观 ...
- 移动OA,致我们终将逝去的青春(程序员版)[转]
移动OA和致青春有什么关系,难道说赵薇也来做手机应用了?为什么不行,当年小燕子代言的打印机可是红火的很,现在再秀一把时尚手机办公也未必不可啊.言归正转,本文还是以点代面阐述移动OA开发过程,但是,它的 ...
- TF2ZP函数
TF2ZP 中TF是什么意思? Transfer function tf 就是传递函数的意思,简称传函 tf2zp是将传递函数转换为零极点形式的一个转换函数 [Z,P,K] = TF2ZP ...
- java中的枚举类型
枚举类型是那些字段由一组固定常量组成的类型.常见的例子有:东南西北四个方向,星期几等. 所有枚举类型都隐式继承java.lang.Enum类型,因为java不支持多重继承,所以枚举不能继承其他任何类. ...
- Eclipse添加代码注释模板
Eclipse支持我们自定义模板,比如文件的注释,类注释,函数注释等功能.eclipse自身有自带的模板,我们也可以自己定义.一次点击:windows->preference—>java- ...