C++ 此类的对象如何仍然能够访问其成员函数?

C++ 此类的对象如何仍然能够访问其成员函数?,c++,linux,class,C++,Linux,Class,我对类和对象没有什么问题。我有这个代码,我只是增加了它的对象的地址,但无论我增加多少次,它仍然能够访问成员函数。请帮助我,我不明白这是什么,我认为这是不应该发生的 #include<iostream> using namespace std; class B { int a,d,b,c; public: void cl() { int f,m,b; cout<<"\nvoid cl"; } } obj; int main() { B *

我对类和对象没有什么问题。我有这个代码,我只是增加了它的对象的地址,但无论我增加多少次,它仍然能够访问成员函数。请帮助我,我不明白这是什么,我认为这是不应该发生的

#include<iostream>
using namespace std;
class B
{
int a,d,b,c;
public:
 void cl()
   {
     int f,m,b;
    cout<<"\nvoid cl";
   }
} obj;

int main()
{  B *m;

  int *i;
  m=&obj;
  cout<<"\nsize of obj="<<sizeof(obj);
  cout<<"\naddress of obj "<<&obj;
  cout<<"\nvalue of m="<<m;
  i=new int;
 // for(int j=0;j<10;j++)
  cout<<"\n value of i "<<*i;
  for(int j=0;j<10;j++)
{ m++;
  cout<<"\nvalue of m++ "<<m++;
  m->cl();
} cout<<"\n";
}
void cl()
的代码不是对象的一部分。编译器静态地知道它的地址,并将它放置在
main()
和二进制文件中的任何其他函数中

基本上,您可以调用一个函数,该函数接受指向对象的指针作为参数,但不使用它。如果您尝试访问
cl()
B
的某些字段,您将获得未定义的行为。

无效cl()的代码不是对象的一部分。编译器静态地知道它的地址,并将它放置在
main()
和二进制文件中的任何其他函数中


基本上,您可以调用一个函数,该函数接受指向对象的指针作为参数,但不使用它。如果您尝试访问
cl()
B
的一些字段,您将获得未定义的行为。

您的代码公开未定义的行为,因此任何事情都可能发生。非常类似于您的代码公开未定义的行为,因此任何事情都可能发生。非常类似于不完全正确
m->cl()
通过取消引用
m
(递增后指向无效对象)的简单动作给出未定义的行为。这种去引用,也就是
->
所做的,甚至在调用
B::cl()
之前发生。调用
B::cl()
也会给出未定义的行为,但这是在取消引用
m
之后发生的。在这两种情况下,未定义的行为都不需要有明显的症状。这不完全正确
m->cl()
通过取消引用
m
(递增后指向无效对象)的简单动作给出未定义的行为。这种去引用,也就是
->
所做的,甚至在调用
B::cl()
之前发生。调用
B::cl()
也会给出未定义的行为,但这是在取消引用
m
之后发生的。在这两种情况下,未定义的行为都不需要有明显的症状。
nik-pc@nik:~/Documents$ ./a.out 

size of obj=16
address of obj 0x6013e0
value of m=0x6013e0
 value of i 0
value of m++ 0x6013f0
void cl
value of m++ 0x601410
void cl
value of m++ 0x601430
void cl
value of m++ 0x601450
void cl
value of m++ 0x601470
void cl
value of m++ 0x601490
void cl
value of m++ 0x6014b0
void cl
value of m++ 0x6014d0
void cl
value of m++ 0x6014f0
void cl
value of m++ 0x601510
void cl
nik-pc@nik: