关于C 类的类

A class ouput about C++ class

本文关键字:关于      更新时间:2023-10-16

我有此代码:

#include <iostream>
using namespace std;
class test {
public:
    int base;
    test() {
        base = 0;
    }
};
class deri : public test {
public:
    int der;
    deri() {
        der = 1;
    }
};
void foo(test* a, size_t size) {
    for (int i = 0; i != size; i++, a++) {
        cout << (*a).base << endl;;
    }
    cout << endl;
}
int main() {
//  test a[5];
    deri b[5];
//  foo(a, 5);
    foo(b, 5);
    return 0;
}

此输出:

0
1
0
1

为什么代码在注释中输出?

foo 认为您正在通过,test实例的数组:

      --------------------------
a --> |base|base|base|base|base|
      --------------------------

每个base初始化为0

您实际通过的是deri实例的数组:

      ----------------------------------------------
a --> |base,der|base,der|base,der|base,der|base,der|
      ----------------------------------------------

每个base初始化为0,并且每个der初始化为1

a递增时,功能会增加test对象的步幅的内存地址(因为这是a的类型),该函数的类型是一个but-One成员:base。实际上,通过的对象是deri,因此有两个成员:baseder。因此,在第一次增加之后,您认为自己正在这样做:

      --------------------------
      |base|base|base|base|base|
      --------------------------
    a -------^

但实际上您正在这样做:

      ----------------------------------------------
      |base,der|base,der|base,der|base,der|base,der|
      ----------------------------------------------
   a -------^

a认为它指向第二个test,实际上指向 first deri对象的第二个成员。一点仪器将显示这一点。在将数组发送到foo之前,打印每个成员的地址,然后显示我们在foo中实际在做什么:

#include <iostream>
using namespace std;
class test {
public:
    int base;
    test() {
        base = 0;
    }
};
class deri : public test {
public:
    int der;
    deri() {
        der = 1;
    }
};
void foo(test* a, size_t size) {
    for (int i = 0; i != size; i++, a++) {
        cout << (const void*)&(*a).base << ',' << (*a).base << endl;;
    }
    cout << endl;
}
int main()
{
    deri b[5];
    for (auto const& x : b)
        std::cout <<(const void*)&x.base << ',' << (const void*)&x.der << 'n';
    foo(b, 5);
    return 0;
}

输出

0x7fff5fbff970,0x7fff5fbff974
0x7fff5fbff978,0x7fff5fbff97c
0x7fff5fbff980,0x7fff5fbff984
0x7fff5fbff988,0x7fff5fbff98c
0x7fff5fbff990,0x7fff5fbff994
0x7fff5fbff970,0
0x7fff5fbff974,1
0x7fff5fbff978,0
0x7fff5fbff97c,1
0x7fff5fbff980,0

请注意,地址将取决于系统,但希望您能理解这个想法。简而言之,您有一个错误

您在" a"(a )上进行迭代。因此,您输入第一个" a"(以右侧开始,请在i 之前a )并输出其基础:0您迭代此基础并显示:1然后,您在" A"上迭代另一个时间,并显示其基础:0。等等...

据我了解,DEDI类的大小是测试尺寸的两倍。我认为,在第一迭代指针A指向对象B [0]和A.base = B [0] .base的乞讨。但是,在第二次迭代中,a对b [0]的中部和a.base的点是b [0] .der。在第三次迭代中,A指向B [1]等。