关于二叉树 - 我已经看到以下代码作为问题解决方案的一部分:
struct Node
{
int key;
struct Node *left, *right;
};
我的问题是" struct Node * left,* right"意味着它是在第一个结构节点定义的主体中定义的。另外,如果这是C ++,为什么你会在这里使用struct而不仅仅是class / object?
答案 0 :(得分:2)
在C ++(尤其是C)中,类型通常总是由它们的构造表示。
例如,
enum Foo { ... };
void doSomethingWithAFoo(enum Foo f);
struct Bar { ... };
void doSomethingWithABar(struct Bar bar);
虽然在C中这是 required ,但它不在C ++中。在C中,它是通过使用typedef
来实现的。
typedef struct { ... } Foo; // Can now be referenced with just `Foo`
但是,规范的某个特定部分指出结构类型不能在它们内部拥有自己的实例(更具体地说,它们声明类型在它们被完全声明之前不能引用它们自己。)
指针形式除外。这是因为指针在编译开始时是已知的大小,而结构只有在声明它们之后才知道。
由于struct
的预先约会C ++(仅一点点)并且自ANSI C(C89)以及之前在大多数主要编译器中出现,它们也存在于C ++中(因为ANSI C可以编译)优雅地在兼容的C ++编译器中)。
但是,C ++添加了类的概念,其中不存在于C中。正如其他人所提到的,类和结构类似,因为它们都包含成员。在C ++中,结构体可以像类一样使用方法 - 显然在C中不是这种情况。
据我所知,唯一的区别是能见度; struct
默认为public,class
默认为private。 C没有可见性的概念。
答案 1 :(得分:1)
完全意味着它的样子。递归声明只是意味着Node结构有两个指向其他节点的字段。
我已经读过C ++中结构和类之间的主要区别是默认权限(默认情况下结构都是公共的)。稍微简单一点,特别是因为继承不太可能。
答案 2 :(得分:0)
struct Node *left, *right;
定义中struct Node
的含义是struct Node
的每个实例都包含指向其他left
和right
的成员struct Node
{1}}秒。
程序员有责任确保在创建struct Node
时,确保这些成员已正确初始化。它们可能设置为NULL
(表示它们不指向任何对象)或另一个struct Node
的地址。
在C ++中,left
和right
的初始化通常在构造函数中完成。 C没有这个功能,所以每次有些C代码创建struct Node
时,通常都必须明确初始化左右成员。
您显示的代码实际上是C,尽管它将被C ++编译器接受。 C ++允许声明struct Node *left, *right;
省略struct
关键字。 C没有。
在C ++中,struct
和class
是相同的 - 不同之处在于成员的可访问性:C ++ struct
成员是public
和class
默认情况下,成员为private
。 C ++ struct
s(和class
es)能够执行C struct
不能做的许多其他事情。