目录
1)可以不特化char*类型,系统不会报错,区别就在于不特化就没有开辟空间。只是指向了字符串。
1.进程和线程的差别。
1)进程:一个正在运行的程序,有创建和终止。执行完,系统回收内存
2)线程:进程内部的一条执行路径(序列)不同语言下,线程的实现机制有所不同。
3)对线程的理解:
main函数和fun函数是两个路径,同时去执行的。叫并发运行。
4)线程是指进程内的一个执行单元,也是进程内的可调度实体。与进程的区别: ①调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 ②并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 ③拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. ④系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
5)线程分类
①用户级线程:无法用多个处理器,开销小,无法利用多处理器
②内核级线程:可以调动不同处理器上同时执行。上节课写的就是这个,开销相对用户大,可以利用多个处理器。
③组合级线程:内核空间可以创建多条线程,用户空间也能创建多个线程。
6)Linux上实现线程的方式
Linux 实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。 Linux 把所有的线程都当作进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有惟一隶凤干日己的 task _ struct ,所以在内核中,它看起来就像是一个普通的进程(只是该进程和其他一些进程共享某些资源,如地址空间)。
2.软件测试方法
1)人工测试:个人复查、抽查和会审
2)机器测试:黑盒测试和白盒测试
3.Template有什么特点?什么时候用?
1)为什么要有模板?
当几个函数只有返回值和数据类型不一样,而函数实现是一样的,避免多次重复写,我们就建立了模板
2)模板分为函数模板和类模板
3)怎么写函数模板(template)
总结:①关键字template,后面<>里面是类型参数表,可以是class T1,class T2……
②执行的时候,把实参的类型提取出来,传给T,而后T替换模板中的T,完成函数调用。
//函数模板,不是函数----经过类型参数化----模板函数
template<class T>//T是通用数据类型 class T是类型参数表
T Max(T a, T b)
{
return a > b ? a : b;
}
void main()
{
cout << Max(4, 6) << endl;//把4和6的类型int传给T,叫类型参数化
cout << Max(3.0, 4.4) << endl;
cout << Max('a', '1') << endl;
}
截图:
4.模板中把特殊的类型特殊化(特化)
1)为什么出现特化?
以Max函数为例,如果要比较两个字符串的大小,是不能用大小于号比的,所以函数的实现部分和以往不一样,另外,如果还是调用普通的Max函数,那么传给T的是字符串的首地址,,并不是字符串本身。
2)如何写特化
总结:1)template<> 括号里不用写类型
3)正常的函数实现即可(函数名和正常函数模板名一样)
//函数模板,不是函数----经过类型参数化----模板函数
template<class T>//T是通用数据类型 class T是类型参数表
T Max(T a, T b)
{
return a > b ? a : b;
}
template<>//特化 把模板中特殊的类型特殊化
const char* Max(const char* a, const char* b)
{
cout << "const char* Max" << endl;
return strcmp(a, b) > 0 ? a : b;
}
void main()
{
cout << Max(4, 6) << endl;//把4和6的类型int传给T,叫类型参数化
cout << Max(3.0, 4.4) << endl;
cout << Max('a', '1') << endl;
cout << Max("111", "222");//把T实例化为const char* a和b是两个指针,比较的是首地址用strcmp才可以
}
结果:
5.怎么写类模板
总结:
1)template<class T>和函数模板一样
2)将所有数据类型换成T
3)调用的时候将参数类型当成实参床给类模板,如下
A<int> a(4);
template<class T>
class A
{
public:
A(T i):m_i(i){}
void Print()
{
cout << "m_i="<<m_i << endl;
}
private:
T m_i;
};
void main()
{
A<int> a(4);//将int作为参数传递给模板中的T,---模板类
A<char>b('6');
A<double> c(3.5);
b.Print();
c.Print();
a.Print();
}
结果:
6.类模板中的特化
1)可以不特化char*类型,系统不会报错,区别就在于不特化就没有开辟空间。只是指向了字符串。
2)想要开辟内存,存下它,所以我们特化
总结:1)template <>和之前一样
2)class A<const char*>和普通的类不一样,<>里面要写参数类型
3)类的实现
//类模板
template<class T>
class A
{
public:
A(T i):m_i(i){}
void Print()
{
cout << "m_i="<<m_i << endl;
}
private:
T m_i;
};
template <>
class A<const char*>
{
public:
A(const char* i)
{
m_i = new char[strlen(i) + 1];
strcpy_s(m_i, strlen(i) + 1, i);
}
void print()
{
cout << "A::m_i=" << m_i << endl;
}
private:
char* m_i;
};
void main()
{
A<int> a(4);//将int作为参数传递给模板中的T,---模板类
A<char>b('6');
A<double> c(3.5);
A<const char*> d("abc");
b.Print();
c.Print();
a.Print();
d.print();
}
截图
7.类模板和函数模板的不同
类模板的调用有<>,函数模板调用没有