`

(转)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修饰函数的返回值;一些有益的建议。

    C语言中const使用说明

    总结了const的各种使用方法,及其作用效果,谢谢观看

    const在函数声明中的应用

    在一个函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:  A& perator=(const A& a);  void fun0(const A* a );  void fun1...

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

    一 const基础;二 const的初始化;三 作为参数和返回值的const修饰符;四 类成员函数中const的使用;五 使用const的一些建议。

    EDA/PLD中的const在函数声明中的应用

    在一个函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:  A& perator=(const A& a);  void fun0(const A* a );  void fun1...

    C++中const用法总结.doc

    C++中const用法总结.doc ...2. const修饰函数参数 3. const 修饰函数返回值 4. const修饰类对象/对象指针/对象引用 5. const修饰成员变量 6. const修饰成员函数 7. const常量与define宏定义的区别

    【小程序云开发】本地调试和云端测试的结果不一致,返回值result为null

    1.调用云函数的时候,云函数调试时返回值不是null,但是到了前端拿到的result却是null。 2.调试云函数,本地调试和云端测试/真机测试结果不一样。表现为本地测试正常运行,云端和真机出错。 解决方法:异步操作的...

    golang调用c++DLL传递char*型参数读取返回char*字符串内容

    golang调用c++DLL返回值为char*参数为const char*,读取返回DLL返回值,传递char*型参数

    jest-when:嘲笑对模拟参数匹配的返回值的支持

    为专门匹配的模拟函数参数指定动态返回值。 灵活的匹配器。 感觉像是标准的笑话语法。 ThoughtWorks说: jest-when是一个轻量级JavaScript库,通过匹配模拟函数调用参数来补充Jest。 Jest是测试堆栈的好工具。 ...

    C++常量详解二(常量形参,常量返回值,常量成员函数)

    常量函数里的const是用来修饰*this的,其形式如下: int f() const{```} 然后这里就有意思了 *this的默认类型是type *const this,this指针有一个顶层const,但并没有底层const,由于低层const的限制,有底层const...

    TP900S TPCOM函数手册.pdf

    动态库函数说明手册 ...1、SendFileToHc 格式:INT WINAPI SendFileToHc(CHAR PORT,...Remark:如果在 AppFile 中指定了一个 mid 文件,该函数会自动下传与 mid 文件同目录 同名的 mif 文件,如果传输失败,函数返回错误 4

    c处理函数 学习c精通必备

     定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);  函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和...

    number函数功能说明.chm

    相关函数:与该函数相关的函数。 2. ACI NUMBER函数 2.1. ACINumberAbs 目的 计算一个NUMBER数值的绝对值。 句法 sword ACINumberAbs ( ACIError *err, const ACINumber *number, ACINumber *result ); ...

    C 语言 strcmp 函数

    int strcmp(const char *str1, const char *str2); 其中,str1和str2是要比较的两个字符串。 strcmp函数返回一个整数值,表示比较结果的大小关系: 如果str1和str2相等,返回值为0。 如果str1小于str2,返回值为一...

    C++笔记之指向函数类型的指针

     这个语句将pf申明为指向函数的指针,它所指向的函数带有两个const string&类型的形参和bool类型的返回值。  注意:*(pf)两侧的圆括号是必须的。bool *pf (const string ,const string &);则表示定义一个名...

    LuaBind 源码 (Lua增强库)

    * 策略参数是用来描述怎样处理该函数参数和返回值的.这是一个可选参数,参见 策略 章节. 下面的例子演示注册函数 float std::sin(float): module(L) [ def("sin", &std::sin) ]; 7.1 重载函数 如果你有同名函数...

    LinuxC函数详解

    本书精选38 1个Linux指令、1 729个...函数说明:strrchr()用来找出参数s字符串中最后一个出现的参数c地 。 址,然后将出现该字符的地址返回。 返回值:如果找到指定的字符,则返回该字符所在地址,否则返回0。 范 例:

    简单比较C语言中的execl()函数与execlp()函数

    函数说明:execl()用来执行参数path 字符串所代表的文件路径, 接下来的参数代表执行该文件时传递过去的argv(0), argv[1], …, 最后一个参数必须用空指针(NULL)作结束. 返回值:如果执行成功则函数不会返回, 执行失败...

    探讨:C++中函数返回引用的注意事项

    以下是几种引用情况:1,引用函数的参数,当然该参数也是一个引用 代码如下:const string &shorterString(const string &s1,const string &s2) { return s1.size()&lt;s2.size()?s1:s2; }以上函数的返回值是引用...

    C++常见面试题,超有用的

    2. CONST 常见题目: a. const 与 #define有什么不同 答案: 1. const 常量有数据类型,而宏没有数据类型。... const 可以用来修饰函数参数、函数返回值,C++还可以用来修饰函数,定义内中某个成员函数为常量函数

Global site tag (gtag.js) - Google Analytics