类的const限定符
来源:互联网 发布:ipad下载付费软件 编辑:程序博客网 时间:2024/06/10 08:42
例子1:
class A{public:A() {}~A() {}public:int Test() const{printf("const\n");return 0;}int Test(){printf("non const\n");return 0;}static int Change() const //这个定义是错误的,静态成员函数上不允许修饰符{return m_a;}private:static int m_a;};int A::m_a = 0;
分析:1. 类中可以定义成员函数Test()的const和非const版本,这已经相当于一种重载了;
2. 静态成员函数不能定义为const类型。
例子2:
#include <stdio.h>class A{public:A() {}~A() {}public:int Test() const{printf("const\n");return 0;}int Test(){printf("non const\n");return 0;}};int main(int argc, char** argv){const A a;A b;a.Test();b.Test();getchar();return 0;}输出结果为:
constnon const
分析:可以看到,const对象调用了const版本, 非const对象调用了非const版本。
例子3:
#include <stdio.h>class A{public:A() {}~A() {}public:int Test() const{printf("const\n");return 0;}};int main(int argc, char** argv){A a;a.Test();getchar();return 0;}输出结果为
const
例子4
#include <stdio.h>class A{public:A() {}~A() {}public:int Test(){printf("non const\n");return 0;}private:static int m_a;};int main(int argc, char** argv){const A a;a.Test(); //出错 error C2662: “int A::Test(void)”: 不能将“this”指针从“const A”转换为“A &”getchar();return 0;}
分析: 从例子3和例子4可以发现,非const对象也可以调用类的const成员函数,const对象不能调用非const成员函数,这是为什么?
因为类对象在调用非静态成员函数的时候会传一个对应的对象指针进去,非const对象传的非const指针可以被转化为const指针,所以可以调用const成员函数,const对象传入的const指针不能转化为非const指针,所以不能调用非const成员函数。
例子5
class A{public:A() {}~A() {}public:int Test(){printf("non const\n");printf("GetValue(): %d\n", GetValue());return 0;}int GetValue() const{return m_a;}private:static int m_a;};
class A{public:A() {}~A() {}public:int Test() const{printf("const\n");printf("GetValue(): %d\n", GetValue()); //错误:error C2662: “int A::GetValue(void)”: 不能将“this”指针从“const A”转换为“A &”return 0;}int GetValue(){return m_a;}private:static int m_a;};int A::m_a = 0;分析:非const成员函数可以调用const成员函数,const成员函数不能调用非const成员函数,理由同上
例子6
#include <stdio.h>class A{public:A() {}~A() {}public:int Test() const{printf("const\n");printf("%d\n", A::Change());return 0;}static int Change(){m_a = 3;return m_a;}private:static int m_a;};int A::m_a = 0;int main(int argc, char** argv){const A a;a.Test(); getchar();return 0;}运行结果如下:
const3分析:const成员函数可以调用静态成员函数,因为静态成员函数没有不会有隐式this指针传进去,所以不会有影响
例子7
#include <stdio.h>class A{public:A(): m_b(0) {}~A() {}public:int Test() const{printf("const\n");m_b = 1;printf("%d\n", m_b);return 0;}static int Change(){m_a = 3;return m_a;}private:mutable int m_b;static int m_a;};int A::m_a = 0;int main(int argc, char** argv){const A a;a.Test(); getchar();return 0;}运行结果如下:
const1分析:一般情况下,const成员函数是不能修改非静态成员变量的,但是只要给非静态成员变量加上mutable修饰符,就可以修改。
0 0
- 类的const限定符
- const限定符的使用
- const限定符的讨论
- const限定符的使用
- const限定符的作用
- const限定符的理解
- C++ const 限定符 指针的使用方法
- 关于const 限定符的一些概念
- const限定修饰符的各种用法
- c++ const限定符的使用
- 【C++】【基础】const限定符的使用
- const限定符的用法总结
- const限定符最基本的
- 关于C/C++的限定符const
- C语言的const类型限定符
- 用 const 限定类的成员函数
- 用 const 限定类的成员函数
- 用const 限定类的成员函数
- 162. Find Peak Element
- Mysql 常用语句
- Android EditText用法及焦点处理总结
- 交换函数的实现
- Linux学习笔记--free命令(查看内存信息的命令)
- 类的const限定符
- mysql锁机制
- java并发编程-synchronized
- Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create()
- java基本数据类型传递与引用传递区别详解
- Oracle Study之-AIX6.1构建Oracle 11gR2 RAC(2)
- jsp页面技术混合
- linux—优化和内存屏障
- js数据类型中的数字与字符串的转换