C++中const修饰函数形参,函数,函数返回值
2017-07-25 13:12
323 查看
转自 http://blog.csdn.net/zz460833359/article/details/48379901
在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢?
先来看一个简单的例子:
[cpp] view
plain copy
#include <iostream>
#include <string>
using namespace std;
void print_str(const string s)
{
cout<<s<<endl;
}
int main()
{
print_str("hello world");
return 0;
}
毫无疑问,const实参传递给const形参,正确调用函数,如果你将第4行代码中的const去掉,也能得到正确的结果。那么在去掉const的基础上将形参变为引用形参,会出现什么样的结果呢?看下面的代码:
[cpp] view
plain copy
#include <iostream>
#include <string>
using namespace std;
void print_str( string & s)
{
cout<<s<<endl;
}
int main()
{
print_str("hello world");
return 0;
}
发现编译不通过,如果在第4行的string前加上一个const,就会通过编译。进一步研究我们会发现指针形参与引用形参会出现类似的情况。
普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。
为什么会出现这种情况?
原因在于实参的传递方式不同,函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,实参会想,你形参反正改变不了我的值,那么你有没有const还有什么意义吗?引用形参和指针形参就下不同了,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的,这种情况下怎能用函数来操纵const实参呢。
http://blog.csdn.net/my_mao/article/details/22872149
[cpp] view
plain copy
#include <iostream>
using namespace std;
class A{
private:
int i;
public:
void set(int n){ //set函数需要设置i的值,所以不能声明为const
i = n;
}
int get() const{ //get函数返回i的值,不需要对i进行修改,则可以用const修饰。防止在函数体内对i进行修改。
return i;
}
};
[cpp] view
plain copy
void fun(const int i){
i = 10;
}
在函数体内是不能改变i的值的,但是没有任何实际意义。
const修饰的函数参数是指针时,代表在函数体内不能修改该指针所指的内容,起到保护作用,在字符串复制的函数中保证不修改源字符串的情况下,实现字符串的复制。
[cpp] view
plain copy
void fun(const char * src, char * des){ //保护源字符串不被修改,若修改src则编译出错。
strcpy(des,src);
}
void main(){
char a[10]="china";
char b[20];
fun(a,b);
cout<<b<<endl;
}
而且const指针可以接收非const和const指针,而非const指针只能接收非const指针。
const修饰引用时:如果函数参数为用户自定义的类对象如:
[cpp] view
plain copy
void h(A a){
…………
…………
}
传递进来的参数a是实参对象的副本,要调用构造函数来构造这个副本,而且函数结束后要调用析构函数来释放这个副本,在空间和时间上都造成了浪费,所以函数参数为类对象的情况,推荐用引用。但按引用传递,造成了安全隐患,通过函数参数的引用可以修改实参的内部数据成员,所以用const来保护实参。
[cpp] view
plain copy
void h(const A & a){
…………
…………
}
[cpp] view
plain copy
#include <iostream>
using namespace std;
class A {
private:
int i;
public:
A(){i=0;}
int & get(){
return i;
}
};
void main(){
A a;
cout<<a.get()<<endl; //数据成员值为0
a.get()=1; //尝试修改a对象的数据成员为1,而且是用函数调用表达式作为左值。
cout<<a.get()<<endl; //数据成员真的被改为1了,返回指针的情况也可以修改成员i的值,所以为了安全起见最好在返回值加上const,使得函数调用表达式不能作为左值
}
在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢?
先来看一个简单的例子:
[cpp] view
plain copy
#include <iostream>
#include <string>
using namespace std;
void print_str(const string s)
{
cout<<s<<endl;
}
int main()
{
print_str("hello world");
return 0;
}
毫无疑问,const实参传递给const形参,正确调用函数,如果你将第4行代码中的const去掉,也能得到正确的结果。那么在去掉const的基础上将形参变为引用形参,会出现什么样的结果呢?看下面的代码:
[cpp] view
plain copy
#include <iostream>
#include <string>
using namespace std;
void print_str( string & s)
{
cout<<s<<endl;
}
int main()
{
print_str("hello world");
return 0;
}
发现编译不通过,如果在第4行的string前加上一个const,就会通过编译。进一步研究我们会发现指针形参与引用形参会出现类似的情况。
普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。
为什么会出现这种情况?
原因在于实参的传递方式不同,函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,实参会想,你形参反正改变不了我的值,那么你有没有const还有什么意义吗?引用形参和指针形参就下不同了,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的,这种情况下怎能用函数来操纵const实参呢。
http://blog.csdn.net/my_mao/article/details/22872149
const修饰函数
在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数。为什么不能调用非const函数?因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。[cpp] view
plain copy
#include <iostream>
using namespace std;
class A{
private:
int i;
public:
void set(int n){ //set函数需要设置i的值,所以不能声明为const
i = n;
}
int get() const{ //get函数返回i的值,不需要对i进行修改,则可以用const修饰。防止在函数体内对i进行修改。
return i;
}
};
const修饰函数参数
防止传入的参数代表的内容在函数体内被改变,但仅对指针和引用有意义。因为如果是按值传递,传给参数的仅仅是实参的副本,即使在函数体内改变了形参,实参也不会得到影响。如:[cpp] view
plain copy
void fun(const int i){
i = 10;
}
在函数体内是不能改变i的值的,但是没有任何实际意义。
const修饰的函数参数是指针时,代表在函数体内不能修改该指针所指的内容,起到保护作用,在字符串复制的函数中保证不修改源字符串的情况下,实现字符串的复制。
[cpp] view
plain copy
void fun(const char * src, char * des){ //保护源字符串不被修改,若修改src则编译出错。
strcpy(des,src);
}
void main(){
char a[10]="china";
char b[20];
fun(a,b);
cout<<b<<endl;
}
而且const指针可以接收非const和const指针,而非const指针只能接收非const指针。
const修饰引用时:如果函数参数为用户自定义的类对象如:
[cpp] view
plain copy
void h(A a){
…………
…………
}
传递进来的参数a是实参对象的副本,要调用构造函数来构造这个副本,而且函数结束后要调用析构函数来释放这个副本,在空间和时间上都造成了浪费,所以函数参数为类对象的情况,推荐用引用。但按引用传递,造成了安全隐患,通过函数参数的引用可以修改实参的内部数据成员,所以用const来保护实参。
[cpp] view
plain copy
void h(const A & a){
…………
…………
}
const修饰函数返回值
也是用const来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改,也常用于运算符重载。归根究底就是使得函数调用表达式不能作为左值。[cpp] view
plain copy
#include <iostream>
using namespace std;
class A {
private:
int i;
public:
A(){i=0;}
int & get(){
return i;
}
};
void main(){
A a;
cout<<a.get()<<endl; //数据成员值为0
a.get()=1; //尝试修改a对象的数据成员为1,而且是用函数调用表达式作为左值。
cout<<a.get()<<endl; //数据成员真的被改为1了,返回指针的情况也可以修改成员i的值,所以为了安全起见最好在返回值加上const,使得函数调用表达式不能作为左值
}
相关文章推荐
- [C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)
- C++学习笔记(3):const与&修饰函数形参的作用
- [C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)
- const 修饰函数参数,返回值,函数体
- const 修饰函数参数,返回值,函数体
- c++ 函数形参关于const和引用
- [C++]函数后面加const修饰
- const 修饰函数参数,返回值,函数体
- 修饰对象再谈const: 用const 修饰函数的返回值
- c++ 函数 const 修饰
- C++函数后面加const修饰
- C++ 函数返回值声明为const的原因
- 【C++总结】函数形参,返回const对象与非const对象,成员函数,函数指针
- 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
- (3)用const修饰函数的参数和函数的返回值
- C/C++的区别(默认值、内联函数、函数重载、const、引用、参数、返回值)
- const 修饰函数参数,返回值,函数体
- const 修饰函数参数,返回值,函数体
- const 修饰函数参数,返回值,函数体
- C/C++ 函数const形参