今天一了一段很基础的代码,用到了static 类成员函数,在测试的过程中发现它是可以通过某个对象去访问它的私有数据!
做一个代码测试:
CMyThread *pThread = static_cast<CMyThread *>(pParam);
CTask *pTask = pThread->m_pTask;//在以前的测试过程中,我知道它(static 成员函数)是
//不能访问this的非static数据成员,要访问也只能通过传参数进来,进行转化一下
//例如上面的static_cast或者其他的类型转换符(我在这里只是简单的做了个测试)
/*
class A{
public :
static void do_a_test(){
A a;
std::cout<<a.i<<std::endl;
}
private:
int i;
};
*这里我做的测试是:m_pTask 是私有成员,pThread是在this在强制转化后的一个类指针
*得到这个this指针后,我再去访问这个类的私有成员m_pTask居然是可以通过的(access to private)
*我在这个基础上我再到外部定义了一个class A,里面有个static 方法,在方法内部定义个
*临时对象a,再去调用私有数据i,也发现是可以被调用的!(可能这个是我自己的一个语法死角,
*没有完全了解到的)
*
*/
/*
*总结:
*(1)普通数据成员属于类的一个具体的对象,只有对象被创建了,普通数据成员才会被分配内存。而静态数据成员属于整个类,即使没有任何对象创建,
类的静态数据成员变量也存在。
*(2)因为类的静态数据成员的存在不依赖与于任何类对象的存在,类的静态数据成员应该在代码中被显示的初始化,一定要在类外进行,例如上例。
*(3)外部访问类的静态成员只能通过类名来访问,例如:test::getCount()。
*(4)类的静态成员函数无法直接访问普通数据成员(可以通过对象名间接的访问),而类的任何成员函数都可以访问类的静态数据成员。
*(5)静态成员和类的普通成员一样,也具有public、protected、private3种访问级别,也可以具有返回值、const修饰符等参数。
*(6)静态成员方法,不能通过去访问非静态的成员数据(by this pointer)
*(7)在静态成员方法中,虽然它不能之间访问(by this pointer)私有数据,但是它也是类本身的一个成员方法
可以通过临时对象或者传参数后进行转换来方法它的私有成员方法.
*/