一,C++中的类成员访问权限;
1,分类:
public: 具有这个访问控制级别的成员是完全公开的,任何环境下都可以通过对象访问这个成员
private: 具有这个访问控制级别的成员是完全保密的,即只能通过指向当前类(不包括派生类)的
this 指针才可以访问,其它环境均无法直接访问这个成员
protected: 具有这个访问控制级别的成员是半公开的:外界无法直接访问这个控制级别的成员,但是派生类的 this 指针可以获得访问能力。
2,C++中的默认权限是:
class是private
class中的成员的缺省权限也是private!
3,类的访问权限是针对于类而言的,如果是同一个类的话,名字空间相同。那么其中的相同的类的对象可以按照this指针操纵其中的成员。
eg:
class Test{
public:
Test();
Test(Test *t); //拷贝构造函数!
private:
int a;
};
Test::Test(Test *t)
{
a=t->a; //直接访问其中的私有,类似this指针!
}
二,C++中类的继承对成员访问权限的影响以及各种继承的权限关系!
1,C++中A类继承B类意味着A类中含有B类的所有成员,当然由于权限的缘故并不能那么顺利的访问他们就是了。
2,各种继承关系导致的访问权限的改变。
1)缺省情况的继承方式是private继承当然这并不是我们所应该的一个设计!所以应该要注意不要随意的用缺省的继承方式!
2) public 继承:
基类中的成员在派生类中的权限变化是: public--> public. protected-->protected. private-->不可访问!3)
3)protected继承:
权限变化是: public-->protected, protected-->protected。 private-->不能访问
4)private继承:
权限变化: public-->private, protected-->private,private-->不能访问。
PS:
a,其中权限发生变化的指的就是在派生类中可以通过this指针读取,但是他对于外界而言的权限发生相应的变化!
b,而其中的不能访问就是指在派生类当中即使是this指针也无法访问了!
c,归纳一点就是说,private的成员在派生类中不具备可访问性,而protectd跟public的成员则根据相应的继承方式而在派生类中的权限发生相应的变化。public不变,protected继承编程protectd,private全部编程private!
d,多层次的继承则按照这个规律递推...
例题:
class Base
{
public:
int m1;
protected:
int m2;
private:
int m3;
};
class PrivateClass:private Base
{
//m1,m2变成私有,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问 }
};
class DrivedFromPri:public PrivateClass
{
//m1,m2不可访问,m3继续保持不可访问
public:
void Test()
{
m1=1 ;//不可访问
m2=2 ;//不可访问
m3=3 ;//不可访问
}
};
class ProtectedClass:protected Base
{
//m1,m2变成受保护数据,m3不可访问 public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问
}
};
class DerivedFromPro:public ProtectedClass
{
//m1,m2继续为保护的,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问
}
};
class PublicClass:public Base
{
//m1公有,m2受保护,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问
}
};
class DerivedFromPub:public PublicClass
{
//m1保持公有,m2保持受保护,m3保持不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问 }
};
void main()
{
PrivateClass priobj ;//m1,m2,m3都不可访问
priobj.m1=1 ;//不可访问
priobj.m2=2 ;//不可访问
priobj.m3=3 ;//不可访问
ProtectedClass proobj ;//m1,m2受保护,m3不可访问
proobj.m1=1 ;//不可访问
proobj.m2=2 ;//不可访问
proobj.m3=3 ;//不可访问
PublicClass pubobj ;//m1公有,m2受保护,m3不可访问
pubobj.m1=1;
pubobj.m2=2 ;//不可访问
pubobj.m3=3 ;//不可访问
}
1,分类:
public: 具有这个访问控制级别的成员是完全公开的,任何环境下都可以通过对象访问这个成员
private: 具有这个访问控制级别的成员是完全保密的,即只能通过指向当前类(不包括派生类)的
this 指针才可以访问,其它环境均无法直接访问这个成员
protected: 具有这个访问控制级别的成员是半公开的:外界无法直接访问这个控制级别的成员,但是派生类的 this 指针可以获得访问能力。
2,C++中的默认权限是:
class是private
class中的成员的缺省权限也是private!
3,类的访问权限是针对于类而言的,如果是同一个类的话,名字空间相同。那么其中的相同的类的对象可以按照this指针操纵其中的成员。
eg:
class Test{
public:
Test();
Test(Test *t); //拷贝构造函数!
private:
int a;
};
Test::Test(Test *t)
{
a=t->a; //直接访问其中的私有,类似this指针!
}
二,C++中类的继承对成员访问权限的影响以及各种继承的权限关系!
1,C++中A类继承B类意味着A类中含有B类的所有成员,当然由于权限的缘故并不能那么顺利的访问他们就是了。
2,各种继承关系导致的访问权限的改变。
1)缺省情况的继承方式是private继承当然这并不是我们所应该的一个设计!所以应该要注意不要随意的用缺省的继承方式!
2) public 继承:
基类中的成员在派生类中的权限变化是: public--> public. protected-->protected. private-->不可访问!3)
3)protected继承:
权限变化是: public-->protected, protected-->protected。 private-->不能访问
4)private继承:
权限变化: public-->private, protected-->private,private-->不能访问。
PS:
a,其中权限发生变化的指的就是在派生类中可以通过this指针读取,但是他对于外界而言的权限发生相应的变化!
b,而其中的不能访问就是指在派生类当中即使是this指针也无法访问了!
c,归纳一点就是说,private的成员在派生类中不具备可访问性,而protectd跟public的成员则根据相应的继承方式而在派生类中的权限发生相应的变化。public不变,protected继承编程protectd,private全部编程private!
d,多层次的继承则按照这个规律递推...
例题:
class Base
{
public:
int m1;
protected:
int m2;
private:
int m3;
};
class PrivateClass:private Base
{
//m1,m2变成私有,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问 }
};
class DrivedFromPri:public PrivateClass
{
//m1,m2不可访问,m3继续保持不可访问
public:
void Test()
{
m1=1 ;//不可访问
m2=2 ;//不可访问
m3=3 ;//不可访问
}
};
class ProtectedClass:protected Base
{
//m1,m2变成受保护数据,m3不可访问 public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问
}
};
class DerivedFromPro:public ProtectedClass
{
//m1,m2继续为保护的,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问
}
};
class PublicClass:public Base
{
//m1公有,m2受保护,m3不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问
}
};
class DerivedFromPub:public PublicClass
{
//m1保持公有,m2保持受保护,m3保持不可访问
public:
void Test()
{
m1=1;
m2=2;
m3=3 ;//不可访问 }
};
void main()
{
PrivateClass priobj ;//m1,m2,m3都不可访问
priobj.m1=1 ;//不可访问
priobj.m2=2 ;//不可访问
priobj.m3=3 ;//不可访问
ProtectedClass proobj ;//m1,m2受保护,m3不可访问
proobj.m1=1 ;//不可访问
proobj.m2=2 ;//不可访问
proobj.m3=3 ;//不可访问
PublicClass pubobj ;//m1公有,m2受保护,m3不可访问
pubobj.m1=1;
pubobj.m2=2 ;//不可访问
pubobj.m3=3 ;//不可访问
}