我正在学习数据结构中的BST。我在课本中遇到了一些我听不懂的代码。
我用这种方式简化了它:
Tree
应该是二进制搜索树。
Node
是Tree中的嵌套结构。
Element
用于在Node中存储数据。(所有这些原本应为模板类,
节点最初还应该存储密钥等。但是,在这种情况下,我将省略这些详细信息。)
#include <iostream>
class Element {
};
class Tree {
public:
struct Node {
Element *element;
};
Node *root;
Element* find() {
Node *tmp = root;
return (Element *) tmp; // this line
}
};
int main() {
Tree t;
std::cout << t.find() << '\n';
return 0;
}
在第16行(如注释所示),(Element *)的功能是什么? 我想这是一次转换,但是如何在两个不同的类之间进行转换呢? (如果我的假设正确)
答案 0 :(得分:3)
在第16行(如注释所示),(Element *)的功能是什么?
我想这是一次转化
是的。这是一个明确的转换;也称为C样式转换。
但是如何在两个不同的类之间进行转换?
在两种情况下,可能会在两个类之间进行转换:一个类具有转换构造函数,而另一个类具有转换运算符。
data
和Node
既没有转换构造函数,也没有转换运算符,因此它们不能相互转换。但是,所示程序不会在类之间转换。它将在指针和类之间转换。
C样式强制转换根据源类型和目标类型执行静态强制转换,const强制转换和重新解释强制转换的一种或组合。对于指向不相关类的指针,没有有效的静态转换,因此将执行重新解释转换。
重新解释指向不相关类型的指针会导致该指针仅具有有限的用途。您可以将其相等性与另一个指针进行比较,也可以将其转换回正确的类型,但是除非有少数情况,否则间接重定向这种重新解释的指针具有未定义的行为。这不是例外情况之一,因此我们可以得出结论,强制类型转换的“功能”是使结果几乎没有用。
P.S。还有另一个问题。 Element
从未被初始化,因此它具有不确定的值,因此t.root
会读取一个不确定的值,因此程序的行为是不确定的。