Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 若类的私有成员不能被非成员函数访问,那个么main()怎么能在这个程序中打印phone的值呢? #包括 班级学生 { 国际电话; 公众: 学生(INTA) { 电话=a; } }; int main() { 一班学生(10); printf(“%p\n”、&s1); printf(“%d\n”、*(&s1)); //printf(“%d\n”,s1.phone); //printf(“%p”和s1.电话); 返回0; }_C++_Object_Member - Fatal编程技术网

C++ 若类的私有成员不能被非成员函数访问,那个么main()怎么能在这个程序中打印phone的值呢? #包括 班级学生 { 国际电话; 公众: 学生(INTA) { 电话=a; } }; int main() { 一班学生(10); printf(“%p\n”、&s1); printf(“%d\n”、*(&s1)); //printf(“%d\n”,s1.phone); //printf(“%p”和s1.电话); 返回0; }

C++ 若类的私有成员不能被非成员函数访问,那个么main()怎么能在这个程序中打印phone的值呢? #包括 班级学生 { 国际电话; 公众: 学生(INTA) { 电话=a; } }; int main() { 一班学生(10); printf(“%p\n”、&s1); printf(“%d\n”、*(&s1)); //printf(“%d\n”,s1.phone); //printf(“%p”和s1.电话); 返回0; },c++,object,member,C++,Object,Member,输出: 0x7fffd5aa5abc 十, 非成员函数能否访问类对象的地址?如果是,为什么我们不能访问其成员 你至少要像 #include <iostream> class student { int phone; public: student(int a) { phone = a; } }; int main() { class student s1(10); printf("%p \n",&s

输出: 0x7fffd5aa5abc
十,


非成员函数能否访问类对象的地址?如果是,为什么我们不能访问其成员

你至少要像

#include <iostream>

class student
{
    int phone;
    public:
    student(int a)
    {
        phone = a;
    }

};

int main()
{
    class student s1(10);
    printf("%p \n",&s1);
    printf("%d \n",*(&s1));
  //  printf("%d \n", s1.phone);
   // printf("%p",&s1.phone);


    return 0;
}
printf(“%d\n”,*reinterpret_cast(&s1));
对于单个非静态数据成员,填充不能位于此类的开头。因此,类的地址等于其单个数据成员的地址

事实上,您并不是直接与私有数据成员打交道。你只是在重新解释一段记忆。通常,如果类不是标准布局类型,则在类的第一个地址可以有任何内容

<>注意,根据C++标准,不同的非访问数据成员的分配顺序是不指定的。因此,例如,如果您将添加一个公共pr保护的数据成员到您的类中,那么就没有必要使用带有类地址的技巧来输出私有数据成员

非成员函数能否访问类对象的地址

对。对象的地址不受任何访问说明符的保护

如果是,为什么我们不能访问其成员

您无法在类外访问名称
电话
,因为它是私有的

但从技术上讲,这并不阻止访问成员对象


%d
格式说明符要求参数为
int
*(&s1)
引用由
s1
命名的对象不是
int
,它违反了该前提条件,因此程序的行为未定义

若类的私有成员不能被非成员函数访问,那个么main()怎么能在这个程序中打印phone的值呢

还是不行。考虑下面的代码:

printf("%d \n",*(&s1));
这不会编译,因为
phone
在这个上下文中是“私有的”。您不能直接访问私有成员变量

这之所以“有效”,是因为
printf
试图将您的
学生
视为
int
。由于存储在该位置的内存可能是
10
(由于内存布局等原因),因此这似乎正常工作。但是,您仍然没有访问私有成员,您正在强制转换为int并欺骗编译器

请注意,所以不要这样做

非成员函数能否访问类对象的地址?如果是,为什么我们不能访问其成员


你有共同的误解。数据封装(与const correction等其他工具一样)是一种帮助您编写更好的程序(即错误更少)的工具。它不是一所监狱或一个看门狗,它不会试图让这一切变得不可能。您想破坏您管理程序复杂性的能力—继续,公开所有成员,不要使用常量限定符等等。如果你想使用这些工具,他们将是你的朋友。这意味着通常在不应该访问数据的时候尝试访问这些数据—编译器会提醒您做了错误的事情,这样您就可以修复错误。这并不意味着它将监视内存并神奇地限制您对它的访问。

类声明定义了一种新的复杂数据类型,它将一个或多个数据成员封装在一个名为object的内存块中。当您试图访问该对象内的某些成员时,编译器将计算正确的偏移量并将其添加到该对象的地址中。 因此,在您的代码中,您的私有成员位于类声明的开头,因此它的偏移量为0,从而产生相同的对象地址。注意,如果您的类具有虚拟函数或从另一个类继承,则这将不是真的


访问修饰符可以帮助您设计更好的代码,但不会对数据内存产生任何保护

欢迎使用undefined behavior land。你对编译器撒了谎,说
*(&s1)
int
,其实它不是。这意味着它可能“起作用”,也可能不起作用。所有的可能性都是正确的。注释< <代码>电话>代码>是注释。这不是根据C++标准的有效程序。任何事情都是允许发生的。请注意,C++有一个新的失败模式,它要求编译器“这是一个程序”有假阳性。仅仅因为它可以编译,并不意味着它是有效的。不幸的是,您必须了解该语言的所有规则并遵守它们,而编译器不能总是帮助您。如果你违反了一条规则,你的程序可能会无声地出现错误(或者更糟;有时会做你想做的事)。访问控制(
public
protected
private
)适用于名称。
main
中的代码不使用名称
phone
,因此不存在涉及访问的问题。另外(某种程度上)放在一边:这个程序可以编译,但有未定义的行为(尽管我确信编译器至少在以下情况下会警告您)演示如果没有足够小心,为什么printf有点危险。如果使用C++标准库<代码>:STD::CUT填充可能不在类的开始,这仅适用于标准布局类。对于任何其他类,此代码为UB:@NathanOliver。在提供的示例中,该类只有一个非静态数据成员。那么你打算在课程的开头附加什么?不
printf("%d \n",*(&s1));
printf("%d \n", s1.phone);