梦回连营 发表于 2021-12-19 10:17:32

参数

#include <iostream>

using namespace std;

void print(const char (&p) ) {
        for (auto c : p)
                cout << c;
}

int main(void)
{
    print("ab");
}

在书上看到这样的参数const char (&p) ,不懂它表达的意思,大概能知道它是类型转化,把字符串转成数组,但是前面为什么一定要加一个const 啊,希望大佬帮忙讲解一下。

傻眼貓咪 发表于 2021-12-19 10:36:44

本帖最后由 傻眼貓咪 于 2021-12-19 10:40 编辑

表示不能更改传入的参数值(以你的代码为例,只打印,不作更改值),而且传入字符串也必须是常量。

梦回连营 发表于 2021-12-19 10:39:58

傻眼貓咪 发表于 2021-12-19 10:36
表示不能更改传入的参数值(以你的代码为例,只打印,不作更改值)

我把const去掉的话, 编译会报错

傻眼貓咪 发表于 2021-12-19 10:42:32

梦回连营 发表于 2021-12-19 10:39
我把const去掉的话, 编译会报错

如果想去掉 const:#include <iostream>

using namespace std;

void print( char (&p) ) {
      for (auto c : p)
                cout << c;
}

int main(void)
{
    char str[] = "ab";
    print(str);
}

梦回连营 发表于 2021-12-19 11:22:34

傻眼貓咪 发表于 2021-12-19 10:42
如果想去掉 const:

能解释一下这之间的机制问题吗

傻眼貓咪 发表于 2021-12-19 12:27:52

梦回连营 发表于 2021-12-19 11:22
能解释一下这之间的机制问题吗

先说声抱歉,因为我不擅长解说长篇大论,如果还是不明白,请自行上网爬文
以你的代码有两点必须注意:
1.)首先以 C 语言为例:
你要先知道以下两种字符串的区别:
char A[] = "ab";
char *B = "ab";
以上两种都能在 C 里正常运作,没有问题,但是在 C++ 11 里肯定报错,为什么呢?
C++ 11 报错:warning: ISO C++ forbids converting a string constant to ‘char*’

明显看出关键字 constant 吧?一个是能修改字符串,一个是不能修改的字符串。而 C++ 对于这点非常敏感,必须改写成:char A[] = "ab";
char *B = (char*)"ab";

2.)参数 &符
举例:#include <iostream>
// using namespace std;

void print_A(int x){
    std::cout << x << std::endl;
}

void print_B(int &x){
    std::cout << x << std::endl;
}

int main()
{
    int num = 13;
    print_A(num);
    print_B(num);
    return 0;
}输出结果:13
13可以看出以上两点输出结果相同,那么为什么又要加个 & 符呢?

如图:第一点,附加 & 符表示只是用作参考,而不加 & 表示用作值。其它特征请自行百度查阅,这里不多讲
所谓参考参数就是可以直接修改参数值,比如:#include <iostream>
// using namespace std;

void A(int &x){ // &x 为参考参数
    x = 9999;
}

void B(int x){ // 一般参数
    x = 9999;
}

int main()
{
    int a = 13, b = 7; // 声明与定义变量
   
    A(a); // 调用函数 A,a 值已经改变,此时 a = 9999
    B(b); // 调用函数 B,b 值没有改变,此时 b = 7(保持原样)
   
    std::cout << a << std::endl;
    std::cout << b << std::endl;
   
    return 0;
}输出结果:9999
7可以看出,参考参数在函数内部做变动,会直接影响外部变量值。

针对以上两点,可以看出你的这个函数参数限制蛮多的:
1.)必须是常量字符串(不能做任何变动更改)
2.)参数作为参考参数(变动改变其值会直接影响函数外部变量值)
页: [1]
查看完整版本: 参数