const成员函数及const

来源:互联网 发布:多线程编程书籍 编辑:程序博客网 时间:2024/04/30 13:12

在成员函数参数列表后面加上const,表示该成员函数是const成员函数。这里的const是修饰this指针的类型。

默认情况下,this的类型是指向类类型对象的常量指针,即指针本身是常量,但指针所指的对象不是常量。

在下面例子中,this的类型是conClass *const,默认情况下不能把this绑定到一个常量对象上。这样使我们不能在一个常量对象上调用普通的成员函数。

如果成员函数不改变this所指对象,应该把this声明成const conClass *const。

#include<iostream>  #include <string>#include <vector>using namespace std;class ConClass{private:int idata;string sdata;public:ConClass(int a,string b) {idata = a;sdata = b;}void print() const{    //const成员函数,只能被常量对象,常量对象的引用或指针调用cout << idata << " " << sdata << endl;}void setData(int _idata, string _sdata) //要修改对象,不能为const成员函数{idata = _idata;sdata = _sdata;}};int main(){const ConClass *myConst1 = new ConClass(2, "test");const ConClass myConst2(3, "TEST");//myConst1->setData(0, "NULL");//错误//myConst2.setData(0, "NULL");   //错误myConst1->print();return 0;}
注意:const成员函数,只能被常量对象,常量对象的引用或指针调用。

构造函数不能被声明为const,当我们创建一个const对象时,知道构造函数完成初始化过程,对象才能真正取得其“常量”属性。


mutable关键字可以修改某个数据成员,即使在一个const成员函数内。

class ConClass{private:int idata;string sdata;mutable int mdata;  //mutable关键字使得该变量在const成员函数中可以被修改public:ConClass(int a, string b) {idata = a;sdata = b;}void print() const{    //const成员函数,只能被常量对象,常量对象的引用或指针调用  cout << idata << " " << sdata << endl;}void setData(int _idata, string _sdata) //要修改对象,不能为const成员函数  {idata = _idata;sdata = _sdata;}void change(int _mdata) const{mdata = _mdata; //可以修改}};


const成员函数返回类引用应该是const类型的引用。

const ConClass& print() const{    //前面的const不能少return *this;        //}

通过区分成员函数是否是const的,可以对其进行重载

#include<iostream>  #include <string>#include <vector>using namespace std;class ConClass{private:int idata = 0;string sdata = "NULL";public:ConClass(int a, string b) {idata = a;sdata = b;}ConClass(){}ConClass &display(std::ostream &os){doDisplay(os);return *this;}const ConClass &display(std::ostream &os) const{//后面const不能少,否则不能形成重载doDisplay(os);return *this;}private:void doDisplay(std::ostream &os) const{os << idata << " " << sdata << endl;}};int main(){const ConClass myConst1;ConClass myConst2(3, "TEST");myConst1.display(cout);  //调用const版本myConst2.display(cout);  //调用非const版本return 0;}

补充:const指针

const如果在*左边,表示指针指向的内容不可修改,const如果在*右边,表示指针本身不可修改。

比如const char* keyword表示指针指向的对象是const char,是不可修改的。

那么const char* const *keyword;表示的含义呢?

很简单,可以这样看(const char *) const * keyword;是一个二级指针。第二个const表示这个二级指针指向的对象是不可修改的(const char *),但是二级指针本身可以修改。

#include <iostream>using namespace std;int main(){const char *const *keywords;const char *p = "hello world!\n";keywords = &p;  //可以修改cout << p << *keywords;return 0;}


0 0
原创粉丝点击