public:公开的,任何人都可以访问
private:私有的,只有这个类的成员函数可以访问成员变量与成员函数
protected:保护的,只有这个类自己以及子子孙孙可以访问
#include<iostream>
using namespace std;
class A{
private:
int i;
int *p;
public:
A(){p=0;i=0;cout<<"A::A()"<<endl;}
~A(){if(p) delete p;cout<<"A::~A(),i="<<i<<endl;}
void set(int ii){i=ii;}
void f(){p=new int;}
void g(A* q){cout<<"A::g(),q->i="<<q->i;}//可以输出q里私有的i,说明可以访问别的对象的私有的内容
//进一步说明:private是对于类的,不是对对象的,同一个类的对象可以相互访问私有的成员变量的,private的权限限制仅仅在编译时刻,运行时刻无限制
};
int main()
{
A* p=new A[10];
for(int i=0;i<10;i++){
p[i].set(i);
}
A b;
b.set(100);
p[0].g(&b);
delete[] p;
return 0;
}
friend:你可以声明别人是你的朋友,之后他就可以访问你的private内容了,这个别人可以是别的类,别的函数(不是类里的函数),别的类里的某个函数。
struct X;//前项声明,告诉编译器有这个东西,但不知道X具体是什么;为什么这么做呢?因为在X的定义里面,我们使用到了Y
struct Y{//为什么不是声明Y呢?因为Y有f(),编译器必须明确知道Y有没有f()
void f(X*);
//如果是void f(X c);则不行
};
struct X{
private:
int i;
public:
void initialize();
friend void g(X*,int);
friend void Y::f(X*);
friend struct Z;
friend void h();
};
void X::initialize(){
i=0;
}
void g(X* x,int i){
x->i=i;
}
void Y::f(X* x){
x->i=47;
}
struct Z{
......
}
friend的授权在编译时刻
class默认private
struct默认public