C++疑难问题自测
myan 2001-01-12 10:23:00 // 不知什么时候从网上当下来的, 翻译成中文, 大家自己测试一把
1. 为什么Scott Meyers说最好把基类的析构函数定义为virtual的?
2. 有一个类A, 定义了缺省构造函数A::A(), 复制构造函数A::A(const A& copy) , 并且
重载了赋值操作A& A::operator=(const A& assign). 那么有下面的语句:
1: A a;
2: A b = a;
请问: 在执行第2行构造对象b时, 是直接执行复制构造函数A::A(const A& copy)还是
先用A::A()生成缺省对象b, 然后再调用A::operator=()来完成对b的构造?
3. 如果基类是模板类, 能否派生非模板类(常规类)? 非模板基类能否派生模板类? 从模板类
派生模板类, 对于模板参数有什么要求? 换句话说, 派生摸板类的模板参数必须跟基类模
板参数一致吗? 如果不是, 相应的规则是什么呢?
4. TA是一个模板类, 现在想写一个模板类TB, 从TA中公有派生出来, TB的声明语法是怎样的?
5. 假如有:
class RA;
...
class RB : public RA;
...
template < typename T >
class TA {
...
}
template < typename T >
class TB : public TA<T> { // 这就是第4题的答案
...
}
请问TB<int>是不是TA<float>的派生类? TB<RB>是不是TA<RA>的派生类? (注意: TB是TA的派生类,
RB是RA的派生类, 也就是说模板类本身和模板参数都存在继承关系).
6. 模板类中定义的成员函数, 通常只有在被调用时才会被实际编译, 这样可以缩小执行文件的体积,
加快编译速度. 但是虚成员函数例外, 模板类中的虚成员函数不论是否被调用, 必须被一律编译,
请解释Stroustrup这个设计的道理何在.
7. 实例化派生模板类会不会导致基类模板类也同时被实例化?
8. 请解释以下C++关键字:
mutable, reinterpret_cast, dynamic_cast, typename, typeid
9. 有一个类my_ptr, 模拟指针的行为, 于是重载了operator*() 和operator->(). 它有一个数据成员
_target, 指向实际的目标对象. 设计时希望对my_ptr的*和->操作能够由_target的*和->操作来实
际完成, 请问在operator*()应该如何实现, 是return *_target还是return _target?
operator->()中呢?
10. class A {
void member_func();
void member_func() const;
...
};
在上面的例子中, 两个member_func()的参数表和返回指都一样, 只不过一个是const的, 另一个不
是. 两者是否构成重载? 如果确实构成重载, 如何判断A_obj.member_func()调用的是哪一个呢?
// 还有一些, 以后再说