`
Sumby
  • 浏览: 1371 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

c++ const 成员函数限定

 
阅读更多
原帖请见 http://www.chinaunix.net/forum/viewtopic.php?t=143183

楼主的这篇文章值得仔细阅读。但是,我觉得上述“const 限定类的成员函数”这一部分写得比较简略,特别是其中“注意”后面的文字,更是使人不知所云,所以想对这一部分做一些补充说明。

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。

在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。

除此之外,在类的成员函数后面加 const 还有什么好处呢?楼主告诉我们的:“获得能力:可以操作常量对象”,其实应该是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。正如非const类型的数据可以给const类型的变量赋值一样,反之则不成立。

对于const成员函数,"不能修改类的数据成员,不能在函数中调用其他不是const的函数",这是由const的属性决定的,楼主说得完全正确。

请看下面一个完整的例子,然后我再作一些说明。

#include <iostream>;

#include <string>;

using namespace std;



class Student {

public:

  Student() {}

  Student( const string& nm, int sc = 0 )

    : name( nm ), score( sc ) {}



  void set_student( const string& nm, int sc = 0 )

  {

    name = nm;

    score = sc;

  }



  const string& get_name() const

  {

    return name;

  }



  int get_score() const

  {

    return score;

  }



private:

  string name;

  int 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 );

}



设计了一个类 Student,数据成员有 name 和 score,有两个构造函数,有一个设置成员数据函数 set_student(),各有一个取得 name 和 score 的函数 get_name() 和 get_score()。请注意 get_name() 和 get_score() 后面都加了 const,而 set_student() 后面没有(也不能有const)。

首先说一点题外话,为什么 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(); // 这两个函数都应该设成 const 型

int get_score();

void output_student( const Student& student )

{

  cout << student.get_name() << "\t"; // 如果 get_name() 和 get_score() 是非const成员函数,这一句和下一句调用是错误的

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

}


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

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

相关推荐

    C++ const使用详解

    C++ 中的 const 关键字非常重要,它可以用来限定变量、指针、函数参数、返回值、成员函数等的值不能被修改。使用 const 可以提高代码的安全性和可读性。但是,需要正确地使用 const,以免出现错误。

    C++const关键字详解

    在C++编程语言中,`const`关键字是一个非常重要的概念,它用于声明常量、限定函数参数以及优化内存管理。本文将深入探讨`const`关键字的各种用法和其背后的原理,帮助读者更全面地理解和应用这一特性。 #### 一、...

    const 限定符的使用

    `const` 限定符在C++编程中是一个重要的特性,用于定义不可变对象,增加代码的稳健性和可读性。本文将深入探讨`const`的使用及其与`#define`预处理器宏的区别。 首先,`const`常量的定义允许程序员创建不可修改的值...

    C++ 中const 类型限定符不兼容问题

    今天在写程序的时候,出现了一个错误 “对象包含与成员函数不兼容的类型限定符”,从网上查了一下,原来原因是这样子的 void showPair(); 改成 void showPair()const; 在具有 如上图所示的函数中,如果调用了其它函数...

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

    // const成员函数 private: int m_num; }; ``` 在这里,`GetCount()`被声明为`const`成员函数,这意味着它不应该修改栈的状态,包括`m_num`等私有成员变量。 - **注意事项**: - `const`成员函数不能修改...

    C++关于Const使用

    #### 二、Const成员函数 在给定的例子中,`int getx() const { return x; };` 是一个典型的`const`成员函数的示例。这里的`const`关键字有两个主要的作用: 1. **确保成员函数不修改任何数据成员**: - 当一个...

    C++中const关键字详解

    // const成员函数 }; ``` `const`成员函数只能访问类中的`const`成员,并且不能修改任何非`const`成员。 #### 五、深入理解`const` 为了更好地理解`const`的含义,我们需要了解它的一些细节: - **位置灵活**: ...

    C++中静态成员函数与静态成员变量(static )

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...

    C++:浅谈修饰符const

    7. const限定类的成员函数:类成员函数声明中的const表示该函数不会修改调用它的对象的状态。这类函数被称为常量成员函数,可以被常量对象调用。 8. const修饰符的注意事项:const修饰符不仅能够提高代码的安全性,...

    详解C/C++中const限定符总结

    需要注意的是,`const`不仅应用于变量,还可以应用于函数参数、返回类型,甚至类的成员,体现了C++对常量正确性的全面支持。在实际编程中,应根据需求灵活运用`const`,遵循“尽可能多地使用`const`”的原则,以提高...

    详解C++中const_cast与reinterpret_cast运算符的用法

    例如,如果有一个const CCTest对象,而我们需要调用一个非const成员函数来修改它的成员变量,我们就可以用const_cast来去除const限定: ```cpp const CCTest* constC = new CCTest; //...后续代码 CCTest* c = const...

    C++语言const 关键字使用方法图文详解

    2. **const成员函数** `const`成员函数承诺不会修改对象的状态。这有助于在多线程环境中保护对象的不变性。例如: ```cpp class MyClass { public: void printValue() const { // 只能读取,不能修改成员变量 ...

    课中资料8

    - 常数据成员可以被const成员函数和非const成员函数引用,但const成员函数不能修改非const数据成员。 总结,`const`关键字在C++中用于保护数据不被意外修改,常成员函数和常对象提供了额外的封装层,增强了代码的...

    const在c++中的用法

    `const` 关键字在 C++ 中的应用非常广泛,不仅限于简单的常量定义,还包括了更复杂的指针类型定义、形参和返回值的限定以及 `const` 成员函数的使用等。正确理解和灵活运用 `const` 不仅能够提高代码的质量,还能...

    大连理工大学c++期中试卷有答案.doc

    const 关键字用于限定对象或数据成员的访问权限,const 对象只能调用 const 成员函数。 二、编程题 1. 编程题的目的是测试学生对 C++ 基础知识的理解和应用能力。 知识点:C++中的类和对象、构造函数和析构函数、...

    Const用法详解 C++

    4. 使用 Const 关键字表明成员函数不会在消息调用中修改目标对象的状态。 例如:`void f1() const {}` Const 的限制 尽管 Const 的使用可以带来多种优点,但它也有一些限制: * Const 变量不能被赋值或修改。...

    c++中const用法详解

    ### C++中`const`关键字的详尽解析与应用实例 #### 一、`const`基本用法 **1.1 限定符声明变量只能被读** `const`关键字用于声明一个只读变量,这意味着一旦该变量被初始化后,其值就不能被更改。例如: ```cpp ...

    const的用法,较详细(c++)

    在类的成员函数中使用`const`限定符表示该成员函数不会修改任何非静态成员变量。 ```cpp class Stack { public: void Push(int elem); int Pop(); int GetCount() const; // 不修改成员变量 private: int m_num;...

Global site tag (gtag.js) - Google Analytics