类的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
原创粉丝点击