C++学习笔记 18

来源:互联网 发布:mac显卡性能测试软件 编辑:程序博客网 时间:2024/06/05 10:37

1,怎么在编译器判断一个类中有没有定义某个特定的方法?
Java存在反射机制,可以判断。C++不存在反射机制。但是C++可以使用了`decltype`关键字,这个关键字具有类型推到的能力,但是它不执行其的表达式,那么其就可以在编译期做很多的事情,这里就是使用它和编译器会尽全力让你的代码时正确的特性来实现这个功能。

这个知识点感觉很冷僻,没用过。

2,构造函数中调析构函数会有什么结果?
假如构造函数中调用了析构函数,由于析构函数的调用是自动的,所以这里肯定要使用new动态申请内存,然后delete来调用析构函数,这样执行完构造函数之后就自动的析构了。

当对象存储于栈上的时候,离开作用域的时候就自动调用析构函数,这样就会造成二次调用析构函数,重复释放内存,出现异常。

3,为什么C++的member function template不能是虚的?
问题的意思是:为什么在C++里面,一个类的成员函数不能既是template又是virtual,比如,下面的代码是不合法的:
这里写图片描述
原因如下:
从Uuix/C开始,一个C/C++程序就可以被分开编译,然后用一个linker链接起来。这种模型有有一个问题,就是各个编译单元可能对另一个编译单元一无所知。 一个function template最后到底会被实例化为多少个函数,要等到整个程序(所有的编译单元)全部被编译完成才知道。 同时,虚函数的实现大多利用了一个“虚函数表”的东西,这种实现中,一个类的内存布局(或者说虚函数表的内存布局)需要在这个类编译完成的时候就被完全确定。

为什么成员函数模板不能是虚函数(virtual)?
这是因为c++ compiler在parse一个类的时候就要确定vtable的大小,如果允许一个虚函数是模板函数,那么compiler就需要在parse这个类之前扫描所有的代码,找出这个模板成员函数的调用(实例化),然后才能确定vtable的大小,而显然这是不可行的,除非改变当前compiler的工作机制。

总结来说,就是受现在的compiler的编译工作机制的限制。