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关系用组合表达,组合耦合度小,容易扩展,继承耦合度太大了,应该优先使用组合,而非继承。
当我们想重用原类型作为新类型的内部实现的话,我们最好自己组合,如果我们不仅想重用内部实现而且还想重用接口的话,那就用继承。
模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板;函数模板针对仅参数类型不同的函数;类模板针对仅数据成员和成员函数类型不同的类。
使用模板的目的就是能够让程序员编写与类型无关的代码。模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在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关系用组合表达,组合耦合度小,容易扩展,继承耦合度太大了,应该优先使用组合,而非继承。
当我们想重用原类型作为新类型的内部实现的话,我们最好自己组合,如果我们不仅想重用内部实现而且还想重用接口的话,那就用继承。
相关文章推荐
- C++内容总结--面向对象语言特点
- C++ 面向对象程序设计上机练习二(函数模板)
- C++面向对象实验三:模板与STL
- C和C++的面向对象专题(5)——合理使用模板,避免代码冗余
- Java学习笔记16(面向对象九:补充内容)
- C++面向对象部分内容总结
- 【C++ 函数模板】SDUT-1141 面向对象程序设计上机练习二(函数模板)
- C++面向对象高级编程(上)-Geekband
- 面向对象_补充_封装_成员与局部变量_static关键字_Math随机数
- C++ 面向对象作业: I/O对象的应用
- C++面向对象高级开发_极客班_第一节课笔记
- c++ 面向切面变成 aop 通用模板
- 面向对象程序设计 第三次作业补充
- C++之对象包含与成员函数不兼容的类型限定符---补充(5)《Effective C++》
- C++面向对象高级开发No.2 - Class With Pointer
- C++面向对象高级编程(上)学习笔记
- C++面向对象特性实现机制的初步分析 Part2
- C和C++的面向对象专题(2)——C语言也能实现面向对象
- 面向对象设计模式之TemplateMethod模板方法(行为型)
- C++ 面向对象写汉罗塔游戏(作风::懒)