您的位置:首页 > 编程语言 > C语言/C++

C++模板、面向对象内容补充

2017-07-23 15:49 176 查看
C++模板如何实现

模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板;函数模板针对仅参数类型不同的函数;类模板针对仅数据成员和成员函数类型不同的类。

使用模板的目的就是能够让程序员编写与类型无关的代码。模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

(1)函数模板:template <class T> void swap(T& a, T& b){}

(2)类模板:template<class T> class A{public: T a; T b; T hy(T c, T &d);};

template<class T1,class T2> void A<T1,T2>::h(){}

2、模板特化
(1)模板的特化是在已有的通用模板不再适用于一些特殊的类型参数时,而针对这些特殊的类型参数专门实现的模板。

(2)模板的偏特化是指需要根据模板的部分参数进行特化。

(3)函数调用匹配的规则是:先精确匹配类型参数,然后匹配函数模板,最后通过参数隐式类型转换进行匹配。

3、explicit是干什么用的?防止隐私转换

4、 必须在构造函数初始化式里进行初始化的数据成员有哪些?

(1)常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面

(2)引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面

(3)没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化

5、为什么基类的析构函数是虚函数?
在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。
6、如何实现只能动态分配类对象,不能定义类对象?
(1)动态分配类对象:就是使用运算符new来创建一个类的对象,在堆上分配内存。

把类的构造函数和析构函数设为protected属性。类对象不能访问,但是派生类可以继承,也可以访问。同时,创建create和destroy两个函数,用于创建类对象。

(create函数设为static,原因是,创建对象的时候A *p=A::create().只有静态成员函数才能有类名直接访问)

(2)静态分配类对象:就是A a,由编译器创建类对象,在栈上分配内存。

重载new和delete

7、继承与组合的区别

is-a关系用继承表达,has-a关系用组合表达,组合耦合度小,容易扩展,继承耦合度太大了,应该优先使用组合,而非继承。

当我们想重用原类型作为新类型的内部实现的话,我们最好自己组合,如果我们不仅想重用内部实现而且还想重用接口的话,那就用继承。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: