函数的形参中带const

wanwan3个月前 (02-01)C++134

在函数中,形参和实参之间的值传递关系和上面讲解的各种常量、变量定义时的初始化是比较像的。接着上面讲解过的范例讲解:

C++
struct student { int num};
void fs(student &stu)
{
    stu.num=1010;
}
student abc ;
abc.num = 100;
fs(abc);
cout << abc. num << endl ;//1010

上面这段代码,可以注意到,在fs()函数中可以修改stu里的num成员,
修改后,该值会被带回到主调函数中,
也就是说,fs()函数中对形参stu的修改实际就是对实参abc的修改,因为这里形参采用的是引用类型。

如果不希望在函数fs中修改形参stu里的值,
建议形参最好使用常量引用(这种习惯希望读者去学习,因为这种习惯经常被用到)。

C++
void fs(const student &stu)
{
    stu.num = 100; //这句就错误了,不能修改stu中的内容
}

再继续看范例:

C++
void fs(const int i)  //实参可以是正常的int,形参可以用constint接,这都没问题
{
    i= 100;
}

这种把形参写成const形式的习惯有许多好处:
(1)可以防止无意中修改了形参值导致实参值被无意中修改掉。
(2)实参类型可以更加灵活。看看如下范例:

C++
struct student{ int num;};
void fs(student &stu)
{

}

那么如下,在主函数中调用就是错误的:

C++
student abc;
abc.num = 100;
const student& def = abc;
fs(def); //错误,因为def的类型是const &,而函数fs的形参,不带const

但是如果像下面这样修改函数的参数:

C++
void fs(const student &stu)
{

}

可以看到,const student &这种类型的形参,可以接收的实参类型更多样化,更加的灵活,他可以接收普通的引用作为实参,也可以接收常量引用作为实参。

阅读更多