2016-03-26 7 views
0

私はclassとobject.iに少し問題がありますが、このコードを持っていて、オブジェクトのアドレスを受け取りますが、何度何回増分してもメンバー関数にアクセスできます。私はそれが起こるとは思わないと思いますか?このクラスのオブジェクトはどのようにしてメンバー関数にアクセスできますか?

#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"; 
} 

、出力は物体の一部

[email protected]:~/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 
[email protected]: 
+0

コードでは未定義の動作が発生するため、何かが起こる可能性があります。 –

+1

[nullポインタのクラスメンバーへのアクセス](http://stackoverflow.com/questions/669742/accessing-class-members-on-a-null-pointer)に非常によく似ています –

答えて

2

void cl()のコードではありません。コンパイラはそのアドレスを静的に知っていて、main()とそれ以外のバイナリ内の関数に沿って配置します。

あなたは基本的に、引数としてオブジェクトへのポインタを受け付けるがそれを使用しない関数を呼び出します。 Bのいくつかのフィールドにcl()の内部でアクセスしようとすると、未定義の動作が発生します。

+0

'm-> cl()'は、mを逆参照する単純な行為(インクリメントされた後、無効なオブジェクトを指す)によって未定義の振る舞いを与えます。逆参照は、 ' - >'が行うもので、 'B :: cl()'が呼び出される前に行われます。 'B :: cl()'の呼び出しは未定義の振る舞いをしますが、それは 'm'の逆参照の後に来ます。未定義の動作は、どちらの場合でも目に見える症状を持つ必要はありません。 – Peter

関連する問題