其他:
- 省略号作函数参数:表示函数的参数是不固定的,可以传递一个或者多个参数(如:printf函数):void Output(int num, ...)
- 函数重载:函数的参数个数,类型不同,注意函数的返回值类型不作为重载依据
- 函数模板:不是说函数模板中class和typedef一样的效果可以互换吗,为是么VS中会报错?!
实例1:
template<class type>//模板参数为模板类型参数
type Add(type a, type b)
{
return a + b;
}
int main()
{
//int n = Add<int>(10.5, 20);
//int n = Add(10.5, 20);//不能这样,除非加一个int或者其他数据类型,如上
int n = Add(10.5, 20.0);
cout << n << endl;
return 0;
}
实例2:
template<class type, int n> //n为模板非类型参数
type Max(type num[n]) //注意n这里表示的是数组长度
{
type Tr = num[0];
for (int i = 0; i < n; i++)
Tr = (Tr > num[i]) ? Tr : num[i];
return Tr;
}
int main()
{
int Num1[5] = { 1, 2, 3, 4, 5 };
int Tr1 = Max<int, 5>(Num1);
cout << Tr1 << endl;
double Num2[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
double Tr2 = Max<double, 5>(Num2);
cout << Tr2 << endl;
return 0;
}
- 函数模板的重载
template<class type>
type Add(type a, type b)
{
return a + b;
}
template<class type>
type Add(type a[], int n) //注意这里是数组,所以a要加[],同时也要注意,函数模板的重载和单纯的函数模板在这里有一点区别
{
type sum = 0;
for (int i = 0; i < n; i++)
{
sum += a[0];
}
return sum;
}
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int sum1 = Add(10, 20);
int sum2 = Add(a, 5); //注意在main中调用时a不加[]
cout << sum1 << " " << sum2 << endl;
return 0;
}
- const修饰:(注:一下内容摘自百度)
int b = 500;
const int* a =
&b;
[1]
int const *a =
&b;
[2]
int* const a =
&b;
[3]
const int* const a
= &b; [4]
如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《effective c++》item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同(即二者等效),都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操 作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。
6.关于VS中的安全访问问题,如:print_s,strcpy_s等,可以通过在最开始定义#define _CRT_SECURE_NO_WARNINGS,注意只能在最开始定义这个宏,否则无效