• 14、【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 << "	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 }
  • 相关阅读:
    typescript基础语法--变量/函数/指令/类
    java获取post请求头部字符串
    spring MVC 3.2中@ResponseBody(Post接口)返回乱码的完美解决方案
    java+js正则表达式获取URL(带端口)域名
    jquery的ajax提交时加载处理方法
    js截取+全部替换+字符串
    Filter过滤器除去部分URL链接
    Eclipse常用快捷键
    CAS+Tomcat SSL第三方数据证书导入(jks)
    CAS客户端和服务器配置https证书
  • 原文地址:https://www.cnblogs.com/Long-w/p/9436179.html
Copyright © 2020-2023  润新知