参数
#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:40 编辑
表示不能更改传入的参数值(以你的代码为例,只打印,不作更改值),而且传入字符串也必须是常量。 傻眼貓咪 发表于 2021-12-19 10:36
表示不能更改传入的参数值(以你的代码为例,只打印,不作更改值)
我把const去掉的话, 编译会报错 梦回连营 发表于 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 10:42
如果想去掉 const:
能解释一下这之间的机制问题吗 梦回连营 发表于 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]