c++,public/protected/private权限修饰符


1.public的变量可以在类中以及外部访问到;

2. private只可以在类/友元中访问到。


#include <iostream>
using namespace std;
//-------------------------------
class Test {
public:
int publicx;
void publicm();
protected://当前类和子类
int protectedx;
void protectedm();
private://当前类
int privatex;
void privatem();
};

//--------------------------------
void Test::privatem() {
cout << "privatem():\n";
this->publicx = 11111;
cout<<this->publicx<<endl;
}
void Test::protectedm() {
cout << "protectedm()..\n";

}
void Test::publicm() {
cout << "publicm()...\n";

}

//--------------------------------
int main() {
Test t;
//t.protectedm();//error C2248: “Test::protectedm”: 无法访问 protected 成员(在“Test”类中声明)
//t.privatem();//error C2248: “Test::privatem”: 无法访问 private 成员(在“Test”类中声明)
t.publicm();
while(1);
return 0;
}



3. C++中同一个类的不同对象可以访问对方的private成员吗?

   可以。在同一个对象甚至是同一个类的对象中,private/public/protected的方法和变量是可以无限制的混访的。【个人测试得到的结论,也许不尽完善。】


4.下面针对private:

类中的私有成员可以在以下四个地方被访问

(1)当前类中;

(2)类的友元函数;//类的友元函数就是在类中把普通的函数用friend进行声明

(3)类的友元成员函数;//类的友元成员函数就是在类中把另一个类的成员函数用friend进行声明

(4)类的友元类中所有成员函数;//类的友元类就是在类中把另一个类用friend进行声明


//类的友元函数:
class Stu {
friend void test2();
private:
int age;
void show( );
}
void test1() {
Stu stu;
stu.age = 23; //错
stu.show(); //错
}
void test2() {
Stu stu;
stu.age = 23; //对
stu.show(); //对
}



//类的友元成员函数
class Stu {
friend void Teacher::test2();
private:
int age;
void show( );
}
class Teacher {
public:
void test1( );
void test2();
}
void Teacher::test2( ) {
Stu stu;
stu.age=2; //对
stu.show(); //对
}
void Teacher::test1( ) {
Stu stu;
stu.age=2; //错
stu.show(); //错
}



//类的友元类 
class Stu {
friend class Teacher;
private:
int age;
void show( );
}
class Teacher {
public:
void test1( );
void test2();
}
void Teacher::test1( ) {
Stu stu;
stu.age=2; //对
stu.show(); //对
}
void Teacher::test2( ) {
Stu stu;
stu.age=2; //对
stu.show(); //对
}


 补充:


/*原则上,C++类中私有变量不允许在类之外的其他任何地方访问,一般来说功能完善的类都会提供get,set方法来操作类属性值,还有就是就是通过友元访问。但是!但如果没有get、set方法都没有提供,也没有定义友元,比如使用的是第三方提供的.o(或者动态库)来进行开发的,并且实际应用中我们确确实实需要改变其中某个对象的一个私有参数,有没有什么办法呢?还有一种比较文艺青年的方法,我们知道,一个进程有程序段和数据段,如果我们知道了对象的数据空间,那么得到该对象的成员变量值也就很简单了,而实际上,对象数据段的首地址其实就是对象地址,以例子说明:*/
#include <iostream>
#include <string>
using namespace std;

class center
{
public:
void setX(float _x){x=_x;}
void setY(float _y){y=_y;}
void setMeanValue(float avg){meanValue=avg;}
float getX(){return x;}
float getY(){return y;}
float getMeanValue(){return meanValue;}
center():x(0.0),y(0.0),meanValue(0.0){}
private:
float x;
float y;
float meanValue;
};

int main()
{
center A;
//普通青年的赋值方法;
A.setX(1.0);
A.setY(4.0);
A.setMeanValue(13.0);
cout<<A.getX()<<" "<<A.getY()<<" "<<A.getMeanValue()<<endl;

//文艺青年的赋值方法;
//*((float*)&A):将center对象A的内存空间强制类型转化为用int*指向的内存空间,访问该内存
float tmp = *((float*)&A);
cout<<tmp<<endl;//输出A.x的值
tmp = *((float*)&A + 1);
cout<<tmp<<endl;//输出A.y的值
*((float*)&A + 2)=2;//修改A.meanValue的值
cout<<A.getMeanValue()<<endl;


while(1);
return 0;
}
//1 4 13
//1
//4
//2