C++ const修饰函数、函数参数、函数返回值

转载自:http://blog.csdn.net/my_mao/article/details/22872149

const修饰函数

在类中将成员函数修饰为const表明在该函数体内, 不能修改对象的数据成员而且不能调用非const函数。为什么不能调用非const函数?因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class A{  
  5. private:  
  6.     int i;  
  7. public:  
  8.     void set(int n){ //set函数需要设置i的值,所以不能声明为const  
  9.         i = n;  
  10.     }  
  11.   
  12.     int get() const//get函数返回i的值,不需要对i进行修改,则可以用const修饰。防止在函数体内对i进行修改。  
  13.         return i;  
  14.     }  
  15. };  
#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修饰函数参数

防止传入的参数代表的内容在函数体内被改变,但仅对指针和引用有意义。因为如果是按值传递,传给参数的仅仅是实参的副本,即使在函数体内改变了形参,实参也不会得到影响。如:

  1. void fun(const int i){  
  2.     i = 10;  
  3. }  
void fun(const int i){
    i = 10;
}
在函数体内是不能改变i的值的,但是没有任何实际意义。
const修饰的函数参数是指针时,代表 在函数体内不能修改该指针所指的内容,起到保护作用,在字符串复制的函数中保证不修改源字符串的情况下,实现字符串的复制。
  1. void fun(const char * src, char * des){  //保护源字符串不被修改,若修改src则编译出错。  
  2.     strcpy(des,src);  
  3. }  
  4. void main(){  
  5.     char a[10]=“china”;  
  6.     char b[20];  
  7.     fun(a,b);  
  8.     cout<<b<<endl;  
  9. }  
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修饰引用时:如果函数参数为用户自定义的类对象如:

  1. void h(A a){  
  2. …………  
  3. …………  
  4. }  
void h(A a){ 
…………
…………
}
传递进来的参数a是实参对象的副本,要调用构造函数来构造这个副本,而且函数结束后要调用析构函数来释放这个副本,在空间和时间上都造成了浪费,所以函数参数为类对象的情况,推荐用引用。但按引用传递,造成了安全隐患,通过函数参数的引用可以修改实参的内部数据成员,所以用const来保护实参。

  1. void h(const A & a){  
  2. …………  
  3. …………  
  4. }  
void h(const A & a){
…………
…………
}

const修饰函数返回值

也是用const来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改,也常用于运算符重载。归根究底就是 使得函数调用表达式不能作为左值。
  1. #include <iostream>    
  2. using namespace std;    
  3.     
  4. class A {  
  5. private:  
  6.     int i;  
  7. public:  
  8.     A(){i=0;}  
  9.     int & get(){  
  10.         return i;  
  11.     }  
  12. };  
  13.   
  14. void main(){  
  15.     A a;  
  16.     cout<<a.get()<<endl; //数据成员值为0  
  17.     a.get()=1; //尝试修改a对象的数据成员为1,而且是用函数调用表达式作为左值。  
  18.     cout<<a.get()<<endl; //数据成员真的被改为1了,返回指针的情况也可以修改成员i的值,所以为了安全起见最好在返回值加上const,使得函数调用表达式不能作为左值  
  19. }  
#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,使得函数调用表达式不能作为左值
}


posted @ 2022-11-20 22:40  风一样的liz  阅读(773)  评论(0编辑  收藏  举报