C++的const类成员函数
2015-09-11 22:05
507 查看
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。例如,
面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数)。例如,
在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const,例如,
在类体之外定义const成员函数时,还必须加上const关键字,例如
若将成员成员函数声明为const,则该函数不允许修改类的数据成员。例如,
在上面成员函数的定义中,ok()的定义是合法的,error()的定义则非法。
值得注意的是,把一个成员函数声明为const可以保证这个成员函数不修改数据成员,但是,如果据成员是指针,则const成员函数并不能保证不修改指针指向的对象,编译器不会把这种修改检测为错误。例如,
虽然m_Name不能被修改,但m_sName是char *类型,const成员函数可以修改其所指向的字符。
const成员函数可以被具有相同参数列表的非const成员函数重载,例如,
在这种情况下,类对象的常量性决定调用哪个函数。
小结:
1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;
2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;
3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。
1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)
2、表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,
任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);
3、唯一的例外是对于mutable修饰的成员。
加了const的成员函数可以被非const对象和const对象调用
但不加const的成员函数只能被非const对象调用
char getData()
const{
return this->letter;
}
参考资料:
《C++ Primer第三版》
《Effective C++第三版》
转自:/article/1365040.html
const char blank = ‘’; blank = ‘\n’; // 错误
面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数)。例如,
const Screen blankScreen; blankScreen.display(); // 对象的读操作 blankScreen.set(‘*’); // 错误:const类对象不允许修改
在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const,例如,
class Screen { public: char get() const; };
在类体之外定义const成员函数时,还必须加上const关键字,例如
char Screen::get() const { return _screen[_cursor]; }
若将成员成员函数声明为const,则该函数不允许修改类的数据成员。例如,
class Screen { public: int ok() const {return _cursor; } int error(intival) const { _cursor = ival; } };
在上面成员函数的定义中,ok()的定义是合法的,error()的定义则非法。
值得注意的是,把一个成员函数声明为const可以保证这个成员函数不修改数据成员,但是,如果据成员是指针,则const成员函数并不能保证不修改指针指向的对象,编译器不会把这种修改检测为错误。例如,
class Name { public: void setName(const string &s) const; private: char *m_sName; }; void setName(const string &s) const { m_sName = s.c_str(); // 错误!不能修改m_sName; for (int i = 0; i < s.size(); ++i) m_sName[i] = s[i]; // 不好的风格,但不是错误的 }
虽然m_Name不能被修改,但m_sName是char *类型,const成员函数可以修改其所指向的字符。
const成员函数可以被具有相同参数列表的非const成员函数重载,例如,
class Screen { public: char get(int x,int y); char get(int x,int y) const; };
在这种情况下,类对象的常量性决定调用哪个函数。
const Screen cs; Screen cc2; char ch = cs.get(0, 0); // 调用const成员函数 ch = cs2.get(0, 0); // 调用非const成员函数
小结:
1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;
2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;
3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。
1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)
2、表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,
任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);
3、唯一的例外是对于mutable修饰的成员。
加了const的成员函数可以被非const对象和const对象调用
但不加const的成员函数只能被非const对象调用
char getData()
const{
return this->letter;
}
参考资料:
《C++ Primer第三版》
《Effective C++第三版》
转自:/article/1365040.html
相关文章推荐
- 项目11.4输入3个双精度实数,分别求出它们的和、平均值、平方和以及平方和的开方,并输出所求出各个值
- C++函数中const形参与非const形参
- 设计模式C++实现(1)——工厂模式
- 项目11.3如何买玫瑰
- P2P通信原理与实现(C++)
- 编写一段程序,从标准输入读取string对象的序列直到连续出现两个相同的单词或者所有单词都读完为止
- 深入理解c语言——‘\0’ ,‘0’, “0” ,0之间的区别
- C++实现图的邻接表
- C++中智能指针的设计和使用
- 设计模式(c++版)
- C/C++
- C语言学习之结构体struct
- Effective C++ 条款45 运用成员函数模板接受所有兼容类型
- 为什么在C++使用pthread_create()的时候,类成员函数做线程的处理函数必须要定义成static类型的?
- C语言实现的百分比加进度条的显示程序
- C++_递归习题汇总
- C语言指针和文件笔记
- C++面试考点
- C++面试考点
- 【more effective c++读书笔记】【第6章】杂项讨论