原帖请见 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 关键字非常重要,它可以用来限定变量、指针、函数参数、返回值、成员函数等的值不能被修改。使用 const 可以提高代码的安全性和可读性。但是,需要正确地使用 const,以免出现错误。
在C++编程语言中,`const`关键字是一个非常重要的概念,它用于声明常量、限定函数参数以及优化内存管理。本文将深入探讨`const`关键字的各种用法和其背后的原理,帮助读者更全面地理解和应用这一特性。 #### 一、...
`const` 限定符在C++编程中是一个重要的特性,用于定义不可变对象,增加代码的稳健性和可读性。本文将深入探讨`const`的使用及其与`#define`预处理器宏的区别。 首先,`const`常量的定义允许程序员创建不可修改的值...
今天在写程序的时候,出现了一个错误 “对象包含与成员函数不兼容的类型限定符”,从网上查了一下,原来原因是这样子的 void showPair(); 改成 void showPair()const; 在具有 如上图所示的函数中,如果调用了其它函数...
// const成员函数 private: int m_num; }; ``` 在这里,`GetCount()`被声明为`const`成员函数,这意味着它不应该修改栈的状态,包括`m_num`等私有成员变量。 - **注意事项**: - `const`成员函数不能修改...
#### 二、Const成员函数 在给定的例子中,`int getx() const { return x; };` 是一个典型的`const`成员函数的示例。这里的`const`关键字有两个主要的作用: 1. **确保成员函数不修改任何数据成员**: - 当一个...
// const成员函数 }; ``` `const`成员函数只能访问类中的`const`成员,并且不能修改任何非`const`成员。 #### 五、深入理解`const` 为了更好地理解`const`的含义,我们需要了解它的一些细节: - **位置灵活**: ...
C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...
7. const限定类的成员函数:类成员函数声明中的const表示该函数不会修改调用它的对象的状态。这类函数被称为常量成员函数,可以被常量对象调用。 8. const修饰符的注意事项:const修饰符不仅能够提高代码的安全性,...
需要注意的是,`const`不仅应用于变量,还可以应用于函数参数、返回类型,甚至类的成员,体现了C++对常量正确性的全面支持。在实际编程中,应根据需求灵活运用`const`,遵循“尽可能多地使用`const`”的原则,以提高...
例如,如果有一个const CCTest对象,而我们需要调用一个非const成员函数来修改它的成员变量,我们就可以用const_cast来去除const限定: ```cpp const CCTest* constC = new CCTest; //...后续代码 CCTest* c = const...
2. **const成员函数** `const`成员函数承诺不会修改对象的状态。这有助于在多线程环境中保护对象的不变性。例如: ```cpp class MyClass { public: void printValue() const { // 只能读取,不能修改成员变量 ...
- 常数据成员可以被const成员函数和非const成员函数引用,但const成员函数不能修改非const数据成员。 总结,`const`关键字在C++中用于保护数据不被意外修改,常成员函数和常对象提供了额外的封装层,增强了代码的...
`const` 关键字在 C++ 中的应用非常广泛,不仅限于简单的常量定义,还包括了更复杂的指针类型定义、形参和返回值的限定以及 `const` 成员函数的使用等。正确理解和灵活运用 `const` 不仅能够提高代码的质量,还能...
const 关键字用于限定对象或数据成员的访问权限,const 对象只能调用 const 成员函数。 二、编程题 1. 编程题的目的是测试学生对 C++ 基础知识的理解和应用能力。 知识点:C++中的类和对象、构造函数和析构函数、...
4. 使用 Const 关键字表明成员函数不会在消息调用中修改目标对象的状态。 例如:`void f1() const {}` Const 的限制 尽管 Const 的使用可以带来多种优点,但它也有一些限制: * Const 变量不能被赋值或修改。...
### C++中`const`关键字的详尽解析与应用实例 #### 一、`const`基本用法 **1.1 限定符声明变量只能被读** `const`关键字用于声明一个只读变量,这意味着一旦该变量被初始化后,其值就不能被更改。例如: ```cpp ...
在类的成员函数中使用`const`限定符表示该成员函数不会修改任何非静态成员变量。 ```cpp class Stack { public: void Push(int elem); int Pop(); int GetCount() const; // 不修改成员变量 private: int m_num;...