C++面试笔记_1
2016-06-03 12:13
295 查看
VC6.0中写模板类将template定义和实现写在一个文件中,不然编译有问题,但是简单模板函数的话分开写可能没问题,在.h最后include .cpp文件
main中进行调用的时候,注意使用点语法调用成员函数,函数的括号不能丢
string模板
include <string>
调用cout或者printf不能直接输出,需要使用方法c_str()转换为字符串
VC6 模板特化!!!
不支持模板的部分特化!!
对swap函数做vector部分的模板特化,但是vector只能做特种类型的模板特化,但是做typename通用模板特化的时候就会编译出错
报错:template_1.cpp
C:\Users\Administrator\Desktop\MyCode\template_1.cpp(25) : error C2667: 'func_swap' :
none of 2 overload have a best conversion
C:\Users\Administrator\Desktop\MyCode\template_1.cpp(25) : error C2668: 'func_swap' :
ambiguous call to overloaded function
解决方案:
不写class V,或者改变函数名为func_swap2
定义构造函数和析构函数class test
{
public:
test()
{}
~test()
{}
private:
注意格式
public成员函数可以调用private成员函数,同一个类中可以,但是外部不能调用private成员函数
析构函数必须是public,直接定义类的实例会报错,但是用new不会报错,但是不会被析构
函数重载和重写:
在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定
具体调用哪个函数,这种机制叫重载,重载不关心函数的返回值类型。
① double calculate(double);
② double calculate(double,double);
③ double calculate(double, int);
④ double calculate(int, double);
⑤ double calculate(int);
⑥ float calculate(float);
⑦ float calculate(double);
六个同名函数calculate,①②③④⑤⑥中任两个均构成重载,⑥和⑦也能构成重载,而①和⑦却不能构成重载,因为①和⑦的参数相同。
覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,
而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。(由虚函数引起的)
成员函数被重载的特征有:
1) 相同的范围(在同一个类中);
2) 函数名字相同;
3) 参数不同;
4) virtual关键字可有可无。
覆盖的特征有:
1) 不同的范围(分别位于派生类与基类);
2) 函数名字相同;
3) 参数相同;
4) 基类函数必须有virtual关键字。
在以下四种情况会产生默认拷贝构造函数
1:类的成员类对象有拷贝构造函数
2:类继承的基类含有拷贝构造函数
3:类含有虚函数
4:类继承于虚基类
template<class T, int maxSize = 100> class stack // 带参数的模板类定义,maxSize默认100 { public: stack(); ~stack(); void push(T t); T pop(); bool isEmpty(); private: int m_maxSize; int m_size; T *m_pT; }; template <class T, int maxSize> stack<T, maxSize>::stack(){ m_maxSize = maxSize; m_size = 0; m_pT = new T[m_maxSize]; }
main中进行调用的时候,注意使用点语法调用成员函数,函数的括号不能丢
string模板
include <string>
调用cout或者printf不能直接输出,需要使用方法c_str()转换为字符串
VC6 模板特化!!!
不支持模板的部分特化!!
对swap函数做vector部分的模板特化,但是vector只能做特种类型的模板特化,但是做typename通用模板特化的时候就会编译出错
template<class T> void func_swap(T &a, T &b) { T tempT; tempT = a; a = b; b = tempT; } template<class V> void func_swap(std::vector<V>&a, std::vector<V>&b) { a.swap(b); }
报错:template_1.cpp
C:\Users\Administrator\Desktop\MyCode\template_1.cpp(25) : error C2667: 'func_swap' :
none of 2 overload have a best conversion
C:\Users\Administrator\Desktop\MyCode\template_1.cpp(25) : error C2668: 'func_swap' :
ambiguous call to overloaded function
解决方案:
不写class V,或者改变函数名为func_swap2
定义构造函数和析构函数class test
{
public:
test()
{}
~test()
{}
private:
注意格式
public成员函数可以调用private成员函数,同一个类中可以,但是外部不能调用private成员函数
析构函数必须是public,直接定义类的实例会报错,但是用new不会报错,但是不会被析构
函数重载和重写:
在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定
具体调用哪个函数,这种机制叫重载,重载不关心函数的返回值类型。
① double calculate(double);
② double calculate(double,double);
③ double calculate(double, int);
④ double calculate(int, double);
⑤ double calculate(int);
⑥ float calculate(float);
⑦ float calculate(double);
六个同名函数calculate,①②③④⑤⑥中任两个均构成重载,⑥和⑦也能构成重载,而①和⑦却不能构成重载,因为①和⑦的参数相同。
覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,
而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。(由虚函数引起的)
成员函数被重载的特征有:
1) 相同的范围(在同一个类中);
2) 函数名字相同;
3) 参数不同;
4) virtual关键字可有可无。
覆盖的特征有:
1) 不同的范围(分别位于派生类与基类);
2) 函数名字相同;
3) 参数相同;
4) 基类函数必须有virtual关键字。
在以下四种情况会产生默认拷贝构造函数
1:类的成员类对象有拷贝构造函数
2:类继承的基类含有拷贝构造函数
3:类含有虚函数
4:类继承于虚基类
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例