c++ 常量成员函数

  结合个人的读书理解,做下常量成员函数的笔记。

  常量成员函数的形式很简单,就是函数的声明定义后跟上一个const,如

class Test {
public:
    int getData() const;
private:
    int data;

};

int Test::getData() const {
    return data;
}

  int getData() const;就是一个常量成员函数了。

  为什么加上一个const就把成员函数变为常量成员函数呢?const关键字到底做了什么?

  按照《c++ primer》上的说法, const的作用是修改隐式this指针的类型。

  对于this指针,百度百科上有如此的描述,"this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。"因为this指针是隐式的,所以我们不能显式地把它定义为const类型,如以下代码是非法的。

int Test::getData(const int* const this) {
    return data;
}

  对此,c++允许的做法是把const关键字放在成员函数的参数列表之后,以此来改变this指针的类型。

  因为传进去的隐式this指针是指向常量的,常量成员函数不能改变调用它的对象的内容,因此常量成员函数多用于读取数据成员。

  常量对象,以及常量对象的引用或指针都只能调用常量成员函数,若成员函数能够改变常量对象,那么常量对象就不是常量了。

时间: 2024-10-26 22:00:44

c++ 常量成员函数的相关文章

常量对象与常量成员函数

常量对象与常量成员函数来防止修改对象,实现最低权限原则. 可以用关键字const来指定对象是不可修改的,任何修改该对象的企图,都会导致编译错误. 例如:const Time noon(12,0,0);    声明一个Time 类的常量对象noon,并将它初始化为中午12点. C++不允许在常量对象上调用成员函数,除非成员函数本身也被声明为常量.甚至对不会修改对象的成员函数,也是如此,此外,编译器不允许声明常量的成员函数修改对象. 对一般情况下,通常修改对象的构造函数和析构函数而言,它们不允许被声

常量成员函数

1.如果不希望摸个对象的值被改变,则在定义该对象的时候可以在前面加const关键字 2.常量对象只能使用构造函数.析构函数和有const说明的函数 3.在定义和声明常量成员函数是在后面加const 4.两个函数,名字和参数表都一样,但是一个是const,一个不是,算重载. 5.mutable 的变量可以在const成员函数中修改 原文地址:https://www.cnblogs.com/-Asurada-/p/10661492.html

《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数

// 构造函数赋值 CTyre(int r, int w):radius(r), width(w) { } 初始化列表 #include<iostream> using namespace std; /*成员对象和封闭类 成员对象: 一个类的成员变量是另一个类的对象 包含 成员对象 的类叫 封闭类 (Enclosing) */ class CTyre { private: int radius; int width; public: CTyre(int r, int w) :radius(r)

修饰 C++ 成员函数的两种关键字总结

修饰 C++ 成员函数的两种关键字总结 常量成员函数 (const 关键字) const 修饰成员函数表示这个成员函数不能修改类的成员变量,因此这种成员函数称为常量成员函数.这样,编译器可以对这个函数进行深度的优化.另外,一个类的常量型示例只能调用常量型成员函数.比如下面这个例子. class Test { public: Test(); int getValue() const; int value(); private: int intValue; }; Test::Test(): intV

类 this指针 const成员函数

C++ Primer 第07章 类 7.1.2 ?Sales_data类的定义如下: #ifndef SALES_DATA_H #define SALES_DATA_H #include <string> #include <iostream> class Sales_data { public: std::string isbn() const {return bookNo;} Sales_data& combine(const Sales_data&); dou

类 this指针 const成员函数 std::string isbn() const {return bookNo;}

转载:http://www.cnblogs.com/little-sjq/p/9fed5450f45316cf35f4b1c17f2f6361.html C++ Primer 第07章 类 7.1.2 ?Sales_data类的定义如下: #ifndef SALES_DATA_H #define SALES_DATA_H #include <string> #include <iostream> class Sales_data { public: std::string isbn

常量对象函数引用和参数传递

定义对象时在前面加上const关键字,则对象的值不会改变. 在类的成员函数说明后加const关键字,则该成员函数为常量成员函数.常量成员函数不应该修改其所作用的对象.因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外). 常量成员函数的重载 两个成员函数,名字和参数表都一样,但是一个是const,一个不是,算重载. 常引用:不同通过常引用修改其所指对象的值. 对象作为函数的参数时,生成该参数需要调用复制构造函数,效率比较低.可以用对象

C++中的const成员函数

数据成员的值反应了对象在程序运行某个时刻的状态.数据成员值的改变是由于对象处理了一条消息,往往是某个成员函数被调用.但是有的时候我们希望,成员函数仅仅是访问数据成员而不对其值进行修改.所以,对象的成员函数被分成了两类: 1. 修改对象状态的成员函数: 2. 获取对象状态的成员函数: 而const 成员函数就是为第2个功能而设计.尽管,只要我们在成员函数里不修改对象数据成员的值就可以认为这是一个获取对象状态 的成员函数,但是有的时候在实现的时候会无意的改变数据成员的值,所以为了起到防范的目的,C+

C++ 常成员函数、常数据成员、常对象

常成员函数在声明和实现时都要带 const 关键字 常成员函数不能修改对象的数据成员,也不能访问类中没有用 const 声明的非常成员函数. 在任何函数中都不能对常数据成员赋值.对常数据成员初始化,只能通过构造函数的初始化列表. 常对象的数据成员在它的生存期内不会被改变,因此定义常对象时必须对其进行初始化.这里的初始化可以通过初始化列表完成,也可以通过构造函数函数体来完成. class Person { public: string name; Person() { name = "mollnn