这篇文章主要的作用是认清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 << " a = " << a << " a1 = " << a1<<endl; 37 cout << " sunday(a) = " << sunday(a); 38 cout << " a = " << a; 39 cout << " sunday(a1) = " << sunday(a1); 40 cout << " a1 = " << 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 << " b1 = " << *b1; 49 cout << " Boy(b1) = " << Boy(b1); 50 cout << " b1 = " << *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 << " c1 = " << c1; 60 cout << " Up(a3) = " << Up(a3);//这里必须分开输出,碰到分号才结束 61 cout << " a3 = " << 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 }