为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
why does setting a reference of a struct equal to another struct only change one data member?
当我尝试这段代码时 我得到的输出是
1 1 | 1 2
但是,如果我摆脱了引用,即
// replace
A& a_ref = b2;
a_ref = b1;
// with
b2 = b1;
输出更改为
1 1 | 1 1
我找不到任何网站来解释为什么会发生这种情况。谁能解释一下?
#include <iostream>
struct A {
int foo;
};
struct B : public A {
int bar;
B(int x,int y) : bar(y) { this->foo=x; }
};
int main(void) {
B b1(1,1), b2(2,2);
A& a_ref = b2;
a_ref = b1;
std::cout << b1.foo << ' ' << b1.bar << " | " << b2.foo << ' ' <<
b2.bar << 'n';
return 0;
}
当你这样做时:
A& a_ref = b2;
引用a_ref
仅引用从A
继承的B
的成员。毕竟,A&
无法知道派生类的成员。
因此,当您这样做时:
a_ref = b1;
复制到a_ref
的唯一成员是它知道的成员,这只是foo
。所以只有b2.foo
变化。
在这种情况下:
b2 = b1;
您正在复制B
对象的所有成员,因此所有成员都会更改。
您使用的是A
引用,它可以绑定到任何派生类型(相同的解释适用于指针(。编译器允许将其绑定到任何对象,因此您可以忘记它的确切类型,无论是A
,B
,只要它继承自A
。 显然,它不知道任何派生类型的内部结构,这就是为什么它只做A
事情。
这可以使用虚函数来处理;在这种情况下,编译器负责放置一个带有指向实际函数(而不仅仅是基类型(的指针的表。由于这些函数共享其签名,因此调用方可以调用其中任何一个,而不关心内部发生的情况。
也就是说,您可以定义一个虚拟副本分配运算符,它将执行您的期望...或者也许不是!
我被愚弄了,以为你可以,但你真的不能......看 虚拟分配操作员C++知道原因。
相关文章:
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 静态结构和一个定义规则
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- 在学习数据结构之前对STL有一个了解是好的吗?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 从另一个 cpp 文件更改结构内、映射键内的变量
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 使用完数据结构后清空数据结构是一个好习惯吗?
- 如何制作一个地图,其中的值是C++中的结构数组
- 如何将数据从一个结构链接到另一个结构
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- std::transform 将一个结构数组复制到另一个结构数组
- C++:如何做一个链表,结构作为参数传递?
- 输入 ctrl + x 后如何再次 cin (cin<<x) 循环(cin 一个结构)
- 两个附带的类层次结构-一个好的设计模式