请问:指向类的指针为什么能够访问私有成员

请教:指向类的指针为什么能够访问私有成员?
这是书上摘抄下来的例子,编译没有错,但有些不明白了,请高手解惑。
C/C++ code
 
template <class Type> class List;

template <class Type> class ListNode
{
friend class List <Type>;
public:
ListNode();
ListNode(const Type& item);
ListNode <Type>* NextNode()
{
return link;
}
void InsertAfter(ListNode <Type>* p);

ListNode <Type>* GetNode(const Type& item, ListNode <Type>* next);

ListNode <Type>* RemoveAfter();
private:
Type data;
ListNode <Type>* link;
};

template <class Type> ListNode <Type>::ListNode(): link (NULL)
{
}

template <class Type> ListNode <Type>::ListNode(const Type& item):data(item), link(NULL)
{
}

template <class Type> void ListNode <Type>::InsertAfter(ListNode <Type>* p)
{
p->link = link;          //[color=#FF0000]此处为什么能用p->link?[/color]
link = p;
}

template <class Type> ListNode <Type>* ListNode <Type>::GetNode(const Type& item, ListNode <Type>* next)
{
ListNode <Type>* newnode=new ListNode <Type> (item, next);
return newnode;
}

template <class Type> ListNode <Type>* ListNode <Type>::RemoveAfter()
{
ListNode <Type>* tempptr=link;
if (link == NULL)
return NULL;
link=tempptr->link;          //tempptr->link?
return tempptr;
}


------解决方案--------------------
InsertAfter 是 ListNode模板类的成员函数
p是ListNode模板类的成员函数的一个指针
同一个类的成员函数访问自己的成员变量貌似无问题。。。。
可能我说得不大清楚。囧

楼主的问题我学的时候也遇到过,在拷贝构造函数时。
------解决方案--------------------
连模板都看到了,却连最基本的私有数据访问问题都没看过?
你们都是怎样一个学习顺序啊?
C++ Primer第三版P514,认真看看。
------解决方案--------------------
访问权限是主要是在类的层面上进行限制,不会细化到同一个类的各个对象。
另外,所有的成员访问,都可以理解为通过指针进行的,既然是对象自己的,也是通过“this”指针来访问的,如果通过指针不能访问私有变量,那私有变量还有什么用处?
------解决方案--------------------
C/C++ code

// 关键点还是这里:ListNode<Type>:: 成员函数可以访问该类的public protected private成员
template <class Type> void ListNode<Type>::InsertAfter(ListNode<Type>* p)
{
    //p->link = link;          //[color=#FF0000]此处为什么能用p->link?[/color]
    p->link = this->link;      // 都是通过指针访问的
    link = p;
}

------解决方案--------------------
呵呵,以前也遇到过与LZ相同的困惑,因为你的insertafter函数是成员函数,而类的所有的成员变量(包括私有变量)都可以被类的成员函数访问的,就像是一家人。。。明白没有。。。。
------解决方案--------------------
面向对象的语言可以大致分两类:
一类以类为访问界限,如C++,同一类的不同对象可以互相访问private成员
另一类以对象为访问界限,如smalltalk,一个对象的private成员只有该对象自身才能访问,不同对象,即使同一类,也不能访问。
或者说,C++更像“面向类”的语言,而smalltalk是“原教旨主义”的面向对象语言

对于LZ的这个问题,可以用另外一个试验来证明,在A类的函数成员实现中,声明一个本类对象,就可以直接访问该对象的私有成员