20 C++按值传参、按地址传参、按引用传参外加const比较详解

这篇文章主要的作用是认清const与指针,以及const参数在按值传参、按地址传参、按引用传参之间的关系。

#注意:const常量是不能改变的,所以不能作为左值,只能作为常量来使用,也就是只能作为右值。下面的调用函数中有带const的都重新定义了一个新变量并且赋初值,不赋初值会报错,然后把const常量赋给新定义的变量。

【指针和const】

1 const int a = 10;
2 int a1 = 10;
3 
4 //int *b1 = &a; const int + int * 不可行
5 //const int *b1=&a; const int + const int * 可行
6 //const int *b1 = &a1; int + const int * 可行

【按值传参】

带const和不带const的实参都可以传给带const或者不带const的形参,都是可行的。像这样:

 1 int sunday(const int x);
 2 int monday(int y);
 3 
 4 const int a = 10;
 5 int a1 = 10;
 6 
 7 monday(a1);//int ->int
 8 sunday(a);//const int -> const int
 9 sunday(a1);//int ->cost int
10 monday(a);//const int ->int

【按地址传参】

带const的指针实参能处理带const和不带const的指针实参;不带const的指针形参只能处理不带const的指针实参,但不能处理带const的指针实参。通俗的讲,就是不管是带const还是不带const的实参都可传给带const的形参,但是带const的实参不能传给不带const的形参。注意看标红的注释,前面的为实参,后面的为形参。像这样:

 1 int Girl(const int *p);
 2 int Boy(int *q);
 3 
 4 int a2 = 10;
 5 
 6 const int *b = &a2;
 7 int *b1 = &a2;
 8 
 9 Boy(b1);//int * ->int * 可行
10 Girl(b);//const int * ->const int * //可行
11 Girl(b1);//int * ->const int * //可行
12 //Boy(b);//const int * ->int * 是不行的

【按引用传参】

跟按地址传参一样,不多说了。

 1 int Up(int &m);
 2 int Down(const int &n);
 3 
 4 int a3 = 10;
 5 
 6 const int &c = a3;
 7 
 8 int &c1 = a3;
 9 
10 Up(c1);//int & -> int &
11 Down(c);//const int & -> const int & ->const int &
12 //Up(c);//const int & ->int & 不可行
13 Down(c1);//int & -> const int &

#注意:按地址传参和按引用传参,形参的值改变会影响到实参(也就是说,实参跟形参一样),按值传递没这个功能,形参不会影响实参,输出结果体现了这一点,按值传参后a和a1的值都没跟着形参改变,但按地址传参和按引用传参,实参就跟着形参变了。

【实例】

 1 #include <iostream>
 2 #include <stdlib.h>
 3  
 4 int sunday(const int x);
 5 int monday(int y);
 6 int Girl(const int *p);
 7 int Boy(int *q);
 8 int Up(int &m);
 9 int Down(const int &n);
10  
11 int main()
12 {
13     using namespace std;
14     const int a = 10;
15     int a1 = 10;
16     int a2 = 10;
17     int a3 = 10;
18     
19  
20     const int *b = &a2;
21     int *b1 = &a2;
22     //int *b1 = &a; const int + int * 不可行
23     //const int *b1=&a; const int + const int * 可行
24     //const int *b1 = &a1; int + const int * 可行
25  
26     const int &c = a3;
27     int &c1 = a3;
28  
29  
30  
31     //按值传参
32     //monday(a1);//int ->int
33     //sunday(a);//const int -> const int
34     //sunday(a1);//int ->cost int
35     //monday(a);//const int ->int
36     cout << "\ta = " << a << "\ta1 = " << a1<<endl;
37     cout << "\tsunday(a) = " << sunday(a);
38     cout << "\ta = " << a;
39     cout << "\tsunday(a1) = " << sunday(a1);
40     cout << "\ta1 = " << a1<< endl;
41     
42     
43     //按地址传参
44     //Boy(b1);//int * ->int * 可行
45     //Girl(b);//const int * ->const int * //可行
46     //Girl(b1);//int * ->const int * //可行
47     //Boy(b);//const int * ->int * 是不行的
48     //cout << "b = " << *b << "\tb1 = " << *b1;
49     cout << "\tBoy(b1) = " << Boy(b1);
50     cout << "\tb1 = " << *b1 << endl;
51     
52  
53  
54     //按引用传参
55     //Up(c1);//int & -> int &
56     //Down(c);//const int & -> const int & ->const int &
57     //Up(c);//const int & ->int & 不可行
58     //Down(c1);//int & -> const int &
59     //cout << "c = " << c << "\tc1 = " << c1;
60     cout << "\tUp(a3) = " << Up(a3);//这里必须分开输出,碰到分号才结束
61     cout << "\ta3 = " << a3 << endl;
62     system("pause");
63     return 0;
64 }
65 int sunday(const int x)
66 {
67     int x1=10;
68     x1 += x;
69     return x1;
70 }
71 int monday(int y)
72 {
73     y = +y;
74     return y;
75 }
76 int Girl(const int *p)
77 {
78     int b=10;
79     b += *p;
80     return b;
81 }
82 int Boy(int *q)
83 {
84     *q += *q;
85     return *q;
86 }
87 int Up(int &m)
88 {
89     m += m;
90     return m;
91 }
92 int Down(const int &n)
93 {
94     int n1 = 0;
95     n1 += n;
96     return n1;
97 }

猜你喜欢

转载自www.cnblogs.com/Long-w/p/9436179.html