关于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
,因此有两个成员:base
和der
。因此,在第一次增加之后,您认为自己正在这样做:
--------------------------
|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]等。
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 关于std::move的使用,是否有编译警告
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 关于C++中具有多重继承"this"指针的说明
- 关于 c++ 函数中指针赋值的简单问题
- 关于 std::min, std::max 中的比较运算符的混淆
- 这是关于成员访问规则的正确摘要吗
- C++ 关于指针取消引用的技术问题
- std::is_trivially_copyable_v 关于虚拟功能
- 关于指向指针数组的指针
- 关于复制构造函数的一个棘手问题
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 关于类的 Python 文档 - 对C++的引用不正确
- 关于 C++ 中的函数类型定义
- 关于条件块的问题与&&运算符有关
- 关于如何使用指向主窗口的指针的 QT 问题
- [temp.variadic]中关于包扩展实例化的措辞