由于本人在自学,因此下列代码不一定正确,仅供参考,如果有错,请指正
- chapter_one
3、
template<typename T>
void fill(T* arr, int start,int end,const T value)
{
for (int i = start; i < end-1; ++i)
{
arr[i] = value;
}
}
4、
template<typename T>
int inner_product(T *a, T *b, int n)
{
int sum = 0;
for (int i = 0; i < n; ++i)
{
sum += a[i] * b[i];
}
return sum;
}
5、
template<typename T>
void iota(T* arr, int size, const int value)
{
//这里a[i]=value+i;
//但是网站上给的答案是a[i]+=value;,作者应该是表达错了
for (int i = 0; i < size; ++i)
{
arr[i] = value + i;
}
}
7、
template<typename T>
size_t mismatch(T* arr, T *brr, int size)
{
for (int i = 0; i < size; ++i)
{
if (arr[i] != brr[i])
return i;
}
//如果都相等,就返回最后一个元素的下一个元素
return size;
}
8、
书上说:签名是由函数的形参类型以及形参个数决定的。返回类型不同无法重载函数,会造成二义性,因此,这两个函数没办法被区分,所以是具有相同的签名
9、
1、函数调用abc(int,int,int),因为abc(1,1,1)的实参类型都是int,所以是精确匹配
2、函数调用abc(float,float,float),因为abc(1.0F,2.0F,3.0F)的实参类型是float,精确匹配
(这里之所以要在数目后面加上一个F,是因为C++默认的小数类型是double,在小数后面加F,是告诉编译器,这是float类型)
3、这里会编译报错,因为abc(1,2,3.0F)实参类型是int,int,float,能够出现两种转换,一种是1,2转换成float类型,一种是3.0F转换成int类型,对于编译器来说,这两种转换都都属于类型转换,是同样的函数匹配等级,因此出现了二义性(注意,和要转换的参数的个数无关,编译器只考虑是否要发生转换)
4、同理,abc(1.0,2.0,3.0)的实参都是double类型,double对于int和float都不是精确匹配,都需要进行类型转换,而转换成int和float是同样的函数匹配转换等级,因此出现了二义性,编译器会报错
10、
int abc(int a, int b, int c)
{
if (a < 0 && b < 0 && c < 0)
throw 1;
if (a == 0 && b == 0 && c == 0)
throw 2;
return a + b * c;
}
int main()
{
try {
abc(-2,-1,-3); }
catch (int a)
{
if (a == 2)
cout << "输入的值不能全为0" << endl;
else
cout << "输入的值不能都小于0" << endl;
}
}
12、
template<