`

(转)const参数,const返回值与const函数

 
阅读更多

原文地址:http://04051051.blog.163.com/blog/static/8600749320103100716140/

 

       在C++程序中,经常用const 来限制对一个对象的操作,例如,将一个变量定义为const 的:

 const  int  n=3;

则这个变量的值不能被修改,即不能对变量赋值。

       const 这个关键字经常出现在函数的定义中,而且会出现在不同的位置,比如:

               int  strcmp (const  char  *str1,const   char  *str2);

              const   int  & min (int  &, int  &);

              void  printMessage (char  *msg) const;

1.const 参数

       出现在函数参数中的const 表示在函数体中不能对这个参数做修改。比如上面的例子中strcmp() 函数用来比较两个字符串的大小,在函数体中不应该改变两个参数的值,所以将它定义为是const 的。const 通常用来限制函数的指针参数,引用和数组参数,而一般形式的参数因为形参和实参本来就不在同一内存空间,所以对形参的修改不会影响实参,因此也没有必要限制函数体不能对参数进行修改。

 

        下面是一些使用函数 const 参数的例子:

(1)  函数 strcpy() 将 src 字符串的内容复制到 targ 字符串中,为保证 src 字符串不被修改,将它定义为 const 参数:

               void  strcpy ( const  char  *src , char  * targ);

(2)  函数 max() 从数组 array 中找出具有最大值的数组元素并返回这个最大元素的值,为保证数组元素不会在函数中被修改, 将它定义为 const  参数:

              int  max ( const  int  array[ ],  int  size);

(3)  函数 outputObject( ) 将类 Myclass 的对象 obj 的内容输出。对象定义为 const  引用,即可以保证对象不会在函数体中有所改变,又可以节省对象传递的开销:

              void  outputObject ( const   Myclass  &obj) ;

PS:

       const 指针可以接受const 和非 const 地址,但是非const 指针只能接受非const 地址。所以const  指针的能力更强一些,所以尽量多用const 指针,这是一种习惯。

2. const 返回值

        函数返回值为 const  只有用在函数返回为引用的情况。 函数返回值引用常量表示不能将函数调用表达式作为左值使用。例如前面讲的返回引用的函数 min( )。

        int  & min ( int  &i,  int  &j); 

可以对函数调用进行赋值,因为它返回的是左值:  min ( a ,  b )=4;

但是,如果对函数的返回值限定为 const  的:const  int  & min ( int & i, int  &j );

那么,就不能对 min ( a, b ) 调用进行赋值了。

3. const 函数

         在类中,可以为类的成员函数进行如下形式的定义:

class  classname {

          int  member ;

  public:

         int  getMember ( ) const

};

       这里,在函数定义头后面加上的 const 表示这个函数是一个“只读函数”,函数不能改变类对象的状态,不能改变对象的成员变量的值。如在函数体中不能这么写

    classname :: getmember( )

   {  member =4 ; 

     return  member;

   }

 另外,const成员函数也不能在函数中调用其他非const 的函数。______________________________________________________________________________

补充:

以下内容转载于: http://www.chinaunix.net/jh/23/300602.html

以下面的例子为例进行说明:

#include <iostream>; 

#include <string>; 

using namespace std;

class Student { 

        string name; 

        int score; 

public: 

    Student ( ) { }  

    Student ( const string& nm, int sc = 0 )  : name( nm ), score( sc ) { } 

   

    void set_student( const string& nm, int sc = 0 )   // 后面不能有const

        {     name = nm;         score = sc;        } 

    const string& get_name() const 

       {     return name;   } 

   int get_score() const 

       {     return score;   } 

}; 

// output student's name and score 

void output_student( const Student& student ) 

  cout << student.get_name() << "\t"; 

  cout << student.get_score() << endl; 

 int main() 

  Student stu( "Wang", 85 ); 

  output_student( stu ); 

}

   

首先说一点题外话,为什么 get_name( ) 前面也加 const。如果没有前后两个 const 的话,get_name() 返回的是对私有数据成员 name 的引用,所以通过这个引用可以改变私有成员 name 的值,如:

  Student stu( "Wang", 85 );

  stu.get_name() = "Li";       //  引用可以作为左值

即把 name 由原来的 "Wang" 变成了 "Li",而这不是我们希望的发生的。所以在 get_name() 前面加 const 避免这种情况的发生。

 

 那么,get_name( ) 和 get_score( ) 这两个后面应该加 const 的成员函数,如果没有 const 修饰的话可不可以呢?回答是可以!但是这样做的代价是:const 对象将不能再调用这两个非const成员函数了。如:

const string& get_name( ); 

int get_score( );         // 这两个函数都应该设成 const 型

void output_student( const Student& student ) 

  { 

  cout << student.get_name() << "\t";

  cout << student.get_score() << endl; 

 // 如果 get_name() 和 get_score() 是非const 成员函数,这两句调用都是错误的

}

 

由 于参数 student 表示的是一个对const Student 型对象的引用,所以 student 不能调用非const 成员函数如 set_student( )。如果 get_name() 和 get_score() 成员函数也变成非const 型,那么上面的 student.get_name() 和 student.get_score() 的使用就是非法的,这样就会给我们处理问题造成困 难。

因此,我们没有理由反对使用const,该加const 时就应该加上const,这样使成员函数除了非const 的对象之外,const 对象也能够调用它。

 

对象.成员函数

         对象          成员函数       对/错
1、  const            const              对
2、  const           non-const       错
3、  non-const     const             对
4、  not-const     non-const       对



          成员函数调用成员函数

     成员函数      成员函数       对/错
5、  const            const             对
6、  const         non-const        错
7、  non-const     const            对
8、  non-const     non-const     对

分享到:
评论

相关推荐

    Const,Const函数,Const变量,函数后面的Const[参考].pdf

    Const 关键字是 C++ 语言中一个非常重要的关键字,它可以用来修饰变量、函数参数、函数返回值等,以确保程序的健壮性和可靠性。 Const 关键字的主要作用是防止意外的变动,提高程序的可靠性和健壮性。 一、Const ...

    Const,Const函数,Const变量,函数后面的Const.txt

    ### 关于Const、Const函数与Const变量的理解 在C++编程语言中,`const`关键字是一种类型限定符,被广泛用于提升代码的安全性与可读性。本文将深入探讨`const`的不同用法及其背后的原理。 #### 1. `const`修饰参数 ...

    虚函数与const指针

    虚函数与const指针 虚函数是C++多态的一种表现形式。虚函数是基类的非静态成员函数,其访问权限可以是 protected 或 public。在基类的类定义中定义虚函数的一般形式为:`virtual 函数返回值类型 虚函数名(形参表)...

    C++中const用法全解

    C++ 中 const 用法全解 const 在 C++ 中占有重要作用,属于小兵立大功的...const 是 C++ 中一个非常重要的关键字,它可以用来修饰变量、指针、函数参数和函数返回值等。正确使用 const 可以提高程序的安全性和可读性。

    const修饰类的成员函数

    3. **返回值类型**:`const`成员函数的返回值类型不受`const`关键字的影响。这意味着即使一个成员函数被声明为`const`,它也可以返回一个非常量的引用或指针等。 #### 六、总结 通过使用`const`关键字修饰类的成员...

    C语言中const使用说明

    在函数声明中,`const`关键字可以修饰参数,表明该参数在函数内部不会被修改。这有助于提高代码的可读性和安全性,同时编译器可以优化对这些参数的处理: ```c void display(const int num) { // num在这里是只读的...

    使用const提高函数的健壮性

    开发者应当在合适的场景中合理使用const,如函数参数、返回值以及成员函数的定义中,这样不仅提高了代码的安全性,还提高了代码的健壮性和可维护性。在编程实践中,合理利用const可以避免很多不易察觉的错误,尤其在...

    c语言const用法小结

    const 是 C 语言中一种非常重要的关键字,它可以用来修饰变量、指针、函数返回值、函数参数和成员函数等。 const 的使用可以提高代码的安全性和可读性,本文将对 const 的各种用法进行总结。 1. const 常量 const ...

    Const资料整理

    Const 是 C++ 语言中一个非常重要的关键字,它可以用来修饰变量、函数、函数参数、返回值等,具有非常广泛的应用场景。下面对 Const 的各种用法进行详细的介绍。 1. Const 变量 Const 变量是一种特殊的变量,它的...

    函数指针和指针函数,const的用法,指针常量,常量指针的用法

    这里的“函数类型”指的是函数返回值的类型,“形参列表”则指定了函数的参数列表。例如: ``` int (*f)(int x); // 定义了一个指向接受一个整型参数并返回整型值的函数的指针 double (*ptr)(double x); // 定义了一...

    const int *a int * const a区别实例

    const 关键字还可以用来修饰函数参数、返回值等,例如: ```cpp void func(const int *a) { // a 是一个指向常量的指针 } ``` 这里,func 函数的参数 a 是一个指向常量的指针, garanty 不会被修改。 const 关键字...

    const T vs. T const

    首先,const关键字可以应用于变量、函数参数、返回值以及类的成员函数等,表示"常量"或"不可变"的意思。当const修饰变量时,该变量的值不允许被修改;当const修饰函数参数时,表示在函数内部不会修改该参数的值;当...

    c++中const用法总结

    通常情况下,`const`可以用来修饰变量、函数参数、返回值等。 #### 三、`const`修饰函数参数 1. **输入参数**: - 当输入参数采用“指针传递”时,添加`const`可以防止意外修改该指针,起到保护作用。例如,在...

    JNI学习二:字符串参数传递与返回值

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码...这个示例中的"JNI学习二:字符串参数传递与返回值"就是一个很好的起点,通过实践可以深入理解JNI的工作原理和使用技巧。

    c语言之const用法

    C 语言之 const 用法 ...const 可以用来定义常量,修饰指针、函数的输入参数和返回值。const 的目的是为了产生高质量的代码,提高代码的可读性,同时保护好不能被任意改变的内存,从而降低 Bug 的概率。

    c++中const关键字使用详解

    const不仅可以用来声明变量,还可以用来修饰函数的参数和返回值,以提供额外的保护。 1. 参数的const修饰 函数参数如果被const修饰,那么在函数内部,参数所指向的内容或者引用的对象将无法被修改。 ```cpp void ...

    C++中const关键字详解

    3. **函数参数**: 通过将函数参数声明为`const`,可以确保函数不会修改传入的参数。 4. **返回值**: 将函数的返回值声明为`const`,可以防止调用者对返回值进行修改。 5. **成员函数**: `const`成员函数表示该函数...

    2、C++中const变量.docx

    * 在函数参数传递中,使用const变量可以防止函数内部修改参数的值。 * 在函数返回值中,使用const变量可以防止返回值被修改。 4. const_cast操作符 const_cast操作符用于将const变量转换为非const变量。它可以用来...

    Const 用法小结

    在C++中,`const`关键字有着广泛的应用,它可以用于定义常量、修饰类的数据成员、指针以及函数参数和返回值。以下是关于`const`的一些详细解释: 1. **const 常量**: - `const int max = 100;` 定义了一个名为`...

    const和define用法

    4. 函数修饰符:const 可以用来修饰函数参数、函数返回值,在 C++ 里还可以用来修饰函数,定义类中某个成员函数为常量函数。 为什么 const 正在取代 #define 由于 const 常量有更多的优点,例如数据类型、类型安全...

Global site tag (gtag.js) - Google Analytics