zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十一)
    install ubuntu on Android mobile phone
    Mac OS, Mac OSX 与Darwin
    About darwin OS
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十)
    Linux下编译安装qemu和libvirt
    libvirt(virsh命令总结)
    深入浅出 kvm qemu libvirt
    自然语言交流系统 phxnet团队 创新实训 项目博客 (九)
    自然语言交流系统 phxnet团队 创新实训 项目博客 (八)
  • 原文地址:https://www.cnblogs.com/Long-w/p/9436179.html
Copyright © 2011-2022 走看看