一、背景设置
F9 增加断点
F5 开始运行调试
F10 一行一行往下执行
F11 单步执行
shift+F11 跳出某个函数
(按照窗口-》内存就可以看到取某个字符串或是整数等的地址,查看元素)
shift+F9 快速监视 可以监视某个变量的内存地址
调试->窗口->反汇编 切汇编代码
ctrl+k+c 快速注释
二、函数模板
1)函数模板
(1)基本范例
#include <iostream>
using namespace std;
namespace _nmsp1
{
//快速注释
//int32_t Sub(int32_t tv1, int32_t tv2)
//{
// return tv1 - tv2;
//}
//float Sub(float tv1, float tv2)
//{
// return tv1 - tv2;
//}
template<typename T> //T:称之为类型模板参数,T代表的是一个类型
//(typename语法上可以用class取代,但是这里的class只是修饰,不表示类)
T sub(T tv1, T tv2)
{
return tv1 - tv2;
}
}
int main()
{
int32_t subv = _nmsp1::sub(3, 5);
cout << "subv=" << subv << endl;
double subv2 = _nmsp1::sub(4.7, 2.1);
cout << "subv=" << subv2 << endl;
}
(2)实例化
dumpbin /all Myproject.obj > MyproJect.txt
double subv = _nmsp1::Sub<double>(3, 5.9);
(3)模板参数的推断
(3.1)常规的参数判断(四种方法)
#include <iostream>
using namespace std;
namespace _nmsp1
{
template <typename T,typename V,typename U>
V Add(T tv1, U tv2)
{
return tv1 + tv2;
}
}
int main()
{
cout << _nmsp1::Add<int,double,double>(15, 17.8) << endl;
}
#include <iostream>
using namespace std;
namespace _nmsp1
{
template <typename V,typename U,typename T>
V Add(T tv1, U tv2)
{
return tv1 + tv2;
}
}
int main()
{
cout << _nmsp1::Add<double>(15, 17.8) << endl;
}
#include <iostream>
using namespace std;
namespace _nmsp1
{
template <typename U,typename T>
auto Add(T tv1, U tv2)
{
return tv1 + tv2;
}
}
int main()
{
cout << _nmsp1::Add(15, 17.8) << endl;
}
- 第四种:返回类型后置语法(这里的auto只是返回类型判断的语法组成部分,并没有类型推导)
#include <iostream>
using namespace std;
namespace _nmsp1
{
template <typename U,typename T>
auto Add(T tv1, U tv2)->decltype(tv1 + tv2)
{
return tv1 + tv2;
}
}
int main()
{
cout << _nmsp1::Add(15, 17.8) << endl;
}
(3.2)各种推断的比较以及空模板参数列表的推断(编译器优先调用非模板函数,也就是普通函数)
mydouble(10)
mydouble<int>(10)
- 3)指定模板参数列表(空的<>看起来没有作用,但是语法上允许,用了<.>
优先调用函数模板 )
auto result3 = mydouble<>(16.9);
2)类模板、变量模板、别名模板
3)类模板的有元
4)可变参模板
5)多态在模板中的应用
6)模板的一些特殊继承关系
7)模板代码的组织结构与模板的显示实例化和声明
|