大家在学习C++语言的时候,讲到类的访问权限问题时,对私有的private部份访问,书上写的都是只能是类内成员可以访问,也就是成员函数可以访问。类外部是不可以访问到,也修改不了值的。
如果不知道什么是类的访问权限,可以先看下这篇文章:类访问控制符
今天跟大家讲一下比较锋茫的方法,在类外用指针来实现修改类内私有pravite成员。(指针是一把双刃 剑,一定要完全理解,不然会伤到自己)。学习以下内容还有预备知识,如果知道类在内存中存放,可以不用看,不明白的可以先看这篇:类中成员定义顺序在内存中排列
现在来讲一种类外修改类私有成员方法:(有不止一种方法,但一定都会要用到指针)
以Cpeople类来做讲解,先定义一个与Cpeople类一样的成员变量CpeopleClone类,这点很重要,不这样定义,在使用时会比较方便(往下看就会明白,也许也不会明白,看各人理解)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class CpeopleClone { private: string ID; string name; bool Gender; unsigned int height; unsigned int weight; protected: unsigned int age; public: CpeopleClone() { ID = "546465"; name= "Ada"; Gender = true; height =100; weight =90; age =50; } void SetVal(string ID,string name,bool Gender,unsigned int height,unsigned int weight,unsigned int age) { this->ID = ID; this->name= name; this->Gender = Gender; this->height =height; this->weight =weight; this->age =age; } }; |
定义好CpeopleClone类。使用方法就是分别取CpeopleClone对象和Cpeople对象的地址。将CpeopleClone对象内存内容直接拷贝到Cpeople对象内存中,从而实现在类外修改类私有成员。
1 2 3 4 5 6 7 8 9 10 11 12 |
Cpeople kim; CpeopleClone kimClone; void* pKim = &kim; void* pkimClone = &kimClone; memcpy(pKim, pkimClone, sizeof(CpeopleClone) ); kim.show(); cout<<endl; kimClone.SetVal("123456","zzzz",false,50,30,30); memcpy(pKim, pkimClone, sizeof(CpeopleClone) ); kim.show(); |
剑走偏锋修改类私有成员方法具体代码:
类外修改类私有成员测试结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ID:546465 name:Ada Gender:1 height:100 weight:90 age:50 ID:123456 name:zzzz Gender:0 height:50 weight:30 age:30 |
通过指针就实现类外修改类私有成员,但这不是正规传统方法,使用时大家自己把握,要完全理解透后再使用,具体用在哪,这个大家自己去思考。