博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【c++】类中的const成员
阅读量:6859 次
发布时间:2019-06-26

本文共 3194 字,大约阅读时间需要 10 分钟。

const成员变量

举个例子

#include 
using namespace std;class A{ public: A(int size) : SIZE(size) {}; private: const int SIZE;}; int main(){ A a(100);}

说明

  • 在类中声明变量为const类型,但是不可以初始化
  • const常量的初始化必须在构造函数初始化列表中初始化,而不可以在构造函数函数体内初始化

但是

 此时的const变量属于具体的一个对象,如何在整个类中都恒定不变呢?

 答案是利用枚举,举例

#include 
using namespace std;class A{ private: enum {SIZE = 100}; public: int array[SIZE];};int main(){ A a;}

枚举常量不会占据对象的存储空间,在编译时被全部求值

但是,它隐含的数据对象类型为整形,不能表示其他类型。

问题

如何定义在类中定义非整形常量?(待解决)

 

话说有几个地方必须在构造函数的初始化列表中():

  1. 类的const常量
  2. 类的引用类型成员
  3. 没有默认构造函数的类类型成员
  4. 如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数

 

const成员函数

任何不修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或调用了其他非const成员函数,编译器就会指出错误。

示例说明

#include 
using namespace std;class Stack{ public: void Push(int item); int Pop(void); int GetCount(void) const; private: int m_num; int m_data[100];};int Stack::GetCount(void) const{ ++m_num; //编译错误,企图修改数据成员 Pop(); //编译错误,企图调用非const函数 return m_num;}

 

同一个类中,可以仅通过是否是const定义两个函数名字、参数、返回值完全相同的两个成员函数,例如:

#include 
using namespace std;class A{ public: A(int v): val(v) {} void print_val() { cout << "not const:" << val << endl;} void print_val() const { cout << "const print_val:" << val << endl;} private: int val;};int main(int argc ,char **argv){ A b(45); b.print_val(); const A a(12); a.print_val();}

输出

结论

同函数名、参数、返回值可以仅通过是否为const来定义为类的两个成员函数。在调用时,const对象调用const成员函数,非const对象调用非const成员函数。

问题 1:

不可以在const函数中改变成员变量的值,那么有没有办法改变?

答案是可以的,把成员变量声明为mutable类型。看程序

#include 
using namespace std;class A{ public: A(int v): val(v) {} void print_val() { cout << "not const:" << val << endl;} void print_val() const { val++; cout << "const print_val:" << val << endl;} private: mutable int val;};int main(int argc ,char **argv){ A b(45); b.print_val(); const A a(12); a.print_val();}

结果

 

问题2:

当类中只有const函数,非const对象是否可以调用const函数?

答案是可以的,程序

#include 
using namespace std;class A{ public: A(int v): val(v) {}// void print_val() { cout << "not const:" << val << endl;} void print_val() const { val++; cout << "const print_val:" << val << endl;} private: mutable int val;};int main(int argc ,char **argv){ A b(45); b.print_val(); const A a(12); a.print_val();}

结果

但是:还有非const函数时,非const对象不可以调研那个const函数(否则,类的数据变量就会发生变化)。

 

问题3:

当类中存在只有 是否为const 不同的两个函数时,const函数是否可以暂时调用那个非const函数?

答案是可以的。用将转化掉表达式的const性质

#include 
using namespace std;class A{ public: A(int v): val(v) {} void print_val() { cout << "not const:" << val << endl;} void const print_val() const { cout << "const print_val:" << val << endl;} private: int val;};int main(int argc ,char **argv){ A b(45); b.print_val(); const A *a = new A(45); const_cast
(a)->print_val(); a->print_val();}

结果

注意

单纯用类转化不行

const A a(45);const_cast a.print_val();

报错

问题4:返回类型是const是怎么回事?

const返回类型只有在修饰指针或引用是才有用。单凭const返回类型不可以重载。

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3244910.html,如需转载请自行联系原作者

你可能感兴趣的文章
c 二叉树的使用
查看>>
Helpers\Assets
查看>>
Thrift安装问题
查看>>
Linux常用命令大全
查看>>
JavaScript:下拉列表框的事件处理
查看>>
ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)
查看>>
jQuery EasyUI实现关闭全部tabs
查看>>
poj3635Full Tank?[分层图最短路]
查看>>
【USACO 1.4】Mother's Milk
查看>>
CentOs 设置静态IP 方法
查看>>
使用Maven构建多模块项目
查看>>
李洪强经典面试题47--UNIX常用命令
查看>>
angularjs中templateUrl的路径问题
查看>>
Linux 命令详解(三)./configure、make、make install 命令
查看>>
分享Kali Linux 2017年第31周镜像文件
查看>>
03-老马jQuery教程-DOM操作
查看>>
mongodb09----replicattion set--健壮性
查看>>
sql中的笛卡尔积
查看>>
C Array length function problem - C / C++
查看>>
ASP.NET中26个常用性能优化方法
查看>>