cpp——类——成员指针
来源:互联网 发布:淘宝如何关闭店铺 编辑:程序博客网 时间:2024/05/05 14:59
概述
this为const指针对象,指向当前实例对象,因此this的本质就是实例对象,non-static数据成员和non-static函数成员跟this相关联,而static数据成员和static函数成员跟this无关联,因此non-static数据成员和non-static函数成员属于实例对象成员,而static数据成员和static函数成员则不属于实例对象成员
同一类作用域内的所有成员(non-static数据成员,non-static函数成员,static数据成员,static函数成员)本质位于同一作用域,而对象名字定义search ignored对象名字的类型,因此同一类作用域内的所有成员名字不能重复(成员名字都是定义)
class CAnimal{public: int getTotalAnimal(); public: int totalAnimal; public: static int getTotalAnimal(); public: static int totalAnimal;};
注:编译error,getTotalAnimal和totalAnimal重复定义
成员指针
class CAnimal{public: CAnimal() : mGroup(1) {} public: int mGroup; public: void init() { cout << "CAnimal::init()" << endl; } public: static int totalGroup; public: static int getTotalGroup() { cout << "CAnimal::getTotalGroup()" << endl; return totalGroup; }};int CAnimal::totalGroup = 5;class CDog : public CAnimal{public: CDog() : mGroup(2) {} public: int mGroup; public: void init() { cout << "CDog::init()" << endl; } public: static int totalGroup; public: static int getTotalGroup() { cout << "CDog::getTotalGroup()" << endl; return totalGroup; }};int CDog::totalGroup = 8;void member_pointer(){ cout << "-----static-----" << endl; int* pAnimalStaticData = &CAnimal::totalGroup; int (*pAnimalStaticFun)() = CAnimal::getTotalGroup; cout << "totalGroup = " << *pAnimalStaticData << endl; pAnimalStaticFun(); pAnimalStaticData = &CDog::totalGroup; pAnimalStaticFun = CDog::getTotalGroup; cout << "totalGroup = " << *pAnimalStaticData << endl; pAnimalStaticFun(); cout << "-----non static-----" << endl; int CAnimal::*pAnimalNonStaticData1 = &CAnimal::mGroup; //int CAnimal::*pAnimalNonStaticData2 = &CDog::mGroup; void (CAnimal::*pAnimalNonStaticFun1)() = &CAnimal::init; //void (CAnimal::*pAnimalNonStaticFun2)() = &CDog::init; int CDog::*pDogNonStaticData1 = &CAnimal::mGroup; int CDog::*pDogNonstaticData2 = &CDog::mGroup; void (CDog::*pDogNonStaticFun1)() = &CAnimal::init; void (CDog::*pDogNonStaticFun2)() = &CDog::init; CDog dog; CDog* pDog = &dog; CAnimal animal = dog; CAnimal* pAnimal = &animal; cout << "mGroup = " << animal.*pAnimalNonStaticData1 << endl; cout << "mGroup = " << dog.*pAnimalNonStaticData1 << endl; //cout << "mGroup = " << animal.*pDogNonStaticData1 << endl; cout << "mGroup = " << dog.*pDogNonStaticData1 << endl; //cout << "mGroup = " << animal.*pDogNonstaticData2 << endl; cout << "mGroup = " << dog.*pDogNonstaticData2 << endl; (animal.*pAnimalNonStaticFun1)(); (dog.*pAnimalNonStaticFun1)(); //(animal.*pDogNonStaticFun1)(); (dog.*pDogNonStaticFun1)(); //(animal.*pDogNonStaticFun2)(); (dog.*pDogNonStaticFun2)(); cout << "mGroup = " << pAnimal->*pAnimalNonStaticData1 << endl; cout << "mGroup = " << pDog->*pAnimalNonStaticData1 << endl; (pAnimal->*pAnimalNonStaticFun1)(); (pDog->*pAnimalNonStaticFun1)();}
output:
-----static-----totalGroup = 5CAnimal::getTotalGroup()totalGroup = 8CDog::getTotalGroup()-----non static-----mGroup = 1mGroup = 1mGroup = 1mGroup = 2CAnimal::init()CAnimal::init()CAnimal::init()CDog::init()mGroup = 1mGroup = 1CAnimal::init()CAnimal::init()
总结
- 从实例对象角度看,父类成员既属父类,也属子类,反之,子类成员只属子类,不属父类,从类作用域角度看,子类作用域嵌套于父类作用域,因此子类既可访问子类作用域,也可访问父类作用域,反之,父类只可访问父类作用域,不可访问子类作用域
- 对于static数据成员和static函数成员,类只有类作用域的含义,跟this无关联,因此引用static数据成员和static函数成员的指针定义跟普通非成员指针定义无区别
- 对于non-static数据成员和non-static函数成员,类既有类作用域的含义,也跟this相关联,因此引用non-static数据成员和non-static函数成员的指针定义跟普通非成员指针定义有区别,通过成员指针定义符(::*)定义non-static数据成员和non-static函数成员的指针,::*前标识类类型(表示指针引用成员与this相关联),::*后标识成员指针对象
- 成员指针运算符.*或->*,前者通过实例对象操作,后者通过实例对象指针操作,注意成员指针运算符和函数调用运算符的优先级关系,函数调用运算符优先级高于成员指针运算符优先级,通过成员指针运算符.*或->*访问成员指针时,把运算符前实例对象地址传给this隐含参数,因此子类可访问父类成员指针,父类不可访问子类成员指针,因为子类指针可隐式转换为父类指针,反之,父类指针不可隐式转换为子类指针
- 子类实例对象包含父类成员,因此子类成员指针既可引用子类成员,也可引用父类成员,反之,父类实例对象不包含子类成员,因此父类成员指针只可引用父类成员,不可引用子类成员,因此可通过子类实例对象访问父类成员指针(因为子类包含最终访问的成员),反之,不可通过父类实例对象访问子类成员指针(因为父类不一定包含最终访问的成员)
- 取static数据成员地址时,必须使用取地址操作符(&),如果不使用取地址操作符(&),获取的是static数据成员值,取non-static数据成员地址时,也必须使用取地址操作符(&),如果不使用取地址操作符(&),在类内部表示取特定类作用域内数据成员值
- 取static函数成员地址时,跟取普通非成员函数地址相同,取地址操作符(&)optional,可omit,取non-static函数成员地址时,必须使用取地址操作符(&),不可omit,此时取地址操作符(&)表示this隐含参数
- 取类成员(static数据成员,static函数成员,non-static数据成员,non-static函数成员)地址时,必须遵守对应类成员访问权限规则,否则就可通过类成员指针间接访问本不应该允许访问的成员
0 0
- cpp——类——成员指针
- cpp——类——成员访问权限
- cpp——类——virtual成员函数
- 智能指针——类指针成员的复制
- CPP类和对象—四个默认成员函数+运算符重载
- cpp——与c之不同——指针
- C++对象指针—指向对象成员的指针
- 对象指针—指向对象成员的指针
- C++ Primer学习笔记——$22 类成员指针
- 类的函数指针——类的成员函数的指针
- cpp——exception
- cpp——RTTI
- cpp——IO
- 成员函数指针——为什么那么复杂?
- 内存泄露——结构体成员指针未初始化
- 达内学习笔记——成员指针
- C++基础—复制控制,指针成员管理
- C++学习笔记(3)——成员变量、成员函数的指针
- 使用Executors创建ExecutorService对象原理简析
- Instruments使用技巧
- Mark
- android屏幕适配
- 检测浏览器的webgl环境
- cpp——类——成员指针
- 重学Spring(一) 依赖注入
- git分支应用
- Ajax
- centos7复制虚拟机后ssh无法登陆的解决办法
- XPATH 注入的介绍与代码防御
- java复制文件的4种方式
- 一个简单的监控网络流量的脚本
- nginx安装