为什么我们可以使用指针访问私有数据成员 class,而不使用 class 中其他成员的友元函数?
Why can we access private data members class using pointers, without using members friend function other members in the class?
如您所知,私有成员只能被 class
中的其他成员访问
class DateClass // members are private by default
{
int m_month; // private, can only be accessed by other members
int m_day; // private, can only be accessed by other members
int m_year; // private, can only be accessed by other members
};
int main()
{
DateClass date;
date.m_month = 12; // error
date.m_day = 15; // error
date.m_year = 2020; // error
return 0;
}
但我很惊讶您可以使用指针来访问私有数据成员。一个例子:
#include <iostream>
class Test {
private:
int data;
public:
Test()
{
data = 0;
}
int getData()
{
return data;
}
};
int main()
{
Test t;
int* ptr = (int*)&t;
*ptr = 10;
std::cout << t.getData(); // it will return 10
return 0;
}
这是故意的吗?为什么私有成员可以通过指针访问?我是初学者,所以这个问题很愚蠢。
实际上是使用语句获取的指针的行为
int* ptr = (int*)&t;
未定义。 (从技术上讲,这是 严格别名 违规)。
C++ 充斥着未定义的结构——这是使该语言极难掌握的原因之一。鉴于您刚刚开始学习 C++(顺便说一下,一本好书是无可替代的),在您知道自己在做什么之前避免所有类型转换。
如您所知,私有成员只能被 class
中的其他成员访问class DateClass // members are private by default
{
int m_month; // private, can only be accessed by other members
int m_day; // private, can only be accessed by other members
int m_year; // private, can only be accessed by other members
};
int main()
{
DateClass date;
date.m_month = 12; // error
date.m_day = 15; // error
date.m_year = 2020; // error
return 0;
}
但我很惊讶您可以使用指针来访问私有数据成员。一个例子:
#include <iostream>
class Test {
private:
int data;
public:
Test()
{
data = 0;
}
int getData()
{
return data;
}
};
int main()
{
Test t;
int* ptr = (int*)&t;
*ptr = 10;
std::cout << t.getData(); // it will return 10
return 0;
}
这是故意的吗?为什么私有成员可以通过指针访问?我是初学者,所以这个问题很愚蠢。
实际上是使用语句获取的指针的行为
int* ptr = (int*)&t;
未定义。 (从技术上讲,这是 严格别名 违规)。
C++ 充斥着未定义的结构——这是使该语言极难掌握的原因之一。鉴于您刚刚开始学习 C++(顺便说一下,一本好书是无可替代的),在您知道自己在做什么之前避免所有类型转换。