C++之函数高级用法……
内联函数
- 内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。
- 一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能
- 使用方式:在原函数前加上
inline
关键字
1 |
|
结果如下:
引用变量
1.基本概念
C++给&符号赋予了另一个含义,将其用来声明引用,例如,要将rodents作为rats变量的别名,可以这样做:
1
2int rats;
int &rodents = rats;- 就像声明中的char*指的是指向char的指针一样,int &指的是指向int的引用
- 上述引用声明允许将rat和rodents互换,它们指向相同的值和内存单元
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using namespace std;
int main(void)
{
int rats;
int &rodents = rats;
rats=100;
cout<<"The rats is:"<<rats<<endl;
cout<<"The rodents is:"<<rodents<<endl;
cout<<"The &rats is:"<<&rats<<endl;
cout<<"The &rodents is:"<<&rodents<<endl;
int cats=50;
rodents=cats;//仅仅代表赋值操作
cout<<"The rats is:"<<rats<<endl;
cout<<"The rodents is:"<<rodents<<endl;
return 0;
}结果如下:
引用后变量就一直跟着最初引用指向的那个变量,如下例中rodents初始化为*pt使得rodents指向rats,接下来将pt改为指向bunnies,并不能改变这样的事实,即rodents引用的是rats
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using namespace std;
int main(void)
{
int rats=101;
int *pt=&rats;
int &rodents=*pt;
int bunnies=50;
pt=&bunnies;
cout<<"The rodents is:"<<rodents<<endl;
return 0;
}结果如下:
2.引用与结构体
1 |
|
结果如下:
3.引用与类对象
1 |
|
结果如下:
4.引用与继承
- ofstream对象可以使用ostream类的方法
- ostream是基类,ofstream是派生类,派生类继承了基类的方法
1 |
|
结果如下:
函数重载
- 可以通过函数重载来设计一系列函数:它们完成相同的工作,但使用不同的参数列表
- 函数重载的判断方法是函数的参数列表不同,即参数的数目和类型不同,与函数的返回值无关
1 |
|
结果如下:
函数模板
函数模板的定义格式:
template<typename T>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using namespace std;
template<typename T>
void Swap(T &a,T &b);
int main(void)
{
int a1,a2;
double b1,b2;
cout<<"Please enter two integers:";
cin>>a1>>a2;
Swap(a1,a2);
cout<<"After Swap,the two integers:"<<a1<<" "<<a2<<endl;
cout<<"--------------------------------------"<<endl;
cout<<"Please enter two double datas:";
cin>>b1>>b2;
Swap(b1,b2);
cout<<"After Swap,the two double datas:"<<b1<<" "<<b2<<endl;
return 0;
}
template<typename T>
void Swap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}结果如下:
显示具体化:
template<> void Swap<student>(student &a,student &b)
具体化优先于常规模板,而非模板函数优先于具体化和常规模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using namespace std;
struct student
{
string name;
double scores;
};
template<typename T>
void Swap(T &a,T &b);
template<> void Swap<student>(student &a,student &b);
int main(void)
{
int a1=1,a2=2;
double b1=9.77,b2=7.99;
Swap(a1,a2);
cout<<"After Swap,the two integers:"<<a1<<" "<<a2<<endl;
cout<<"------------------------------------------"<<endl;
Swap(b1,b2);
cout<<"After Swap,the two double datas:"<<b1<<" "<<b2<<endl;
cout<<"------------------------------------------"<<endl;
student stu1={"ssy",99.87};
student stu2={"wcf",68.94};
cout<<"The original struct data:"<<endl;
cout<<stu1.name<<" gets scores at:"<<stu1.scores<<endl;
cout<<stu2.name<<" gets scores at:"<<stu2.scores<<endl;
Swap(stu1,stu2);
cout<<"After Swap,the result:"<<endl;
cout<<stu1.name<<" gets scores at:"<<stu1.scores<<endl;
cout<<stu2.name<<" gets scores at:"<<stu2.scores<<endl;
return 0;
}
template<typename T>
void Swap(T &a,T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}//如果数据类型为student的执行了这个函数,那么结构体内的name和scores都会交换
//显示具体化,即出现数据类型为student时,优先执行这个函数,而不是通用的Swap函数
template<> void Swap<student>(student &a,student &b)
{
double temp;
temp=a.scores;
a.scores=b.scores;
b.scores=temp;
}结果如下:
使用
函数名<>
强行使得编译器调用模板函数,<>中可以加数据类型,表示指定模板变量为对应数据类型变量1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using namespace std;
template<typename T>
T lesser(T a,T b);
int lesser(int &a,int &b);
int main(void)
{
int x=10,y=8;
double a=9.87,b=7.56;
cout<<"The lesser answer of x and y is:"<<endl;
cout<<lesser(x,y)<<endl;
cout<<"The lesser answer of a and b is:"<<endl;
cout<<lesser(a,b)<<endl;
cout<<"----------------------------------"<<endl;
cout<<lesser<>(x,y)<<endl;//强制使用模板函数
cout<<lesser<int>(a,b)<<endl;//使得传入的a,b强制转化为int类型
cout<<lesser<int>(a,x)<<endl;
return 0;
}
template<typename T>
T lesser(T a,T b)
{
cout<<"Using template lesser!"<<endl;
T result;
result=a>b?b:a;
return result;
}
int lesser(int &a,int &b)
{
cout<<"Using normal lesser!"<<endl;
int result;
result=a>b?b:a;
return result;
}结果如下: