[英]Pointer Syntax C++
关于二叉树 - 我已经看到以下代码作为问题解决方案的一部分:
struct Node
{
int key;
struct Node *left, *right;
};
我的问题是“struct Node * left,* right”是什么意思,因为它是在第一个struct Node定义的主体中定义的。 如果这是C ++,为什么你会在这里使用struct而不仅仅是class / object?
在C ++(尤其是C)中,类型通常总是由它们的构造表示。
例如,
enum Foo { ... };
void doSomethingWithAFoo(enum Foo f);
struct Bar { ... };
void doSomethingWithABar(struct Bar bar);
虽然这在C中是必需的,但它不是在C ++中。 在C中,它是通过使用typedef
实现的。
typedef struct { ... } Foo; // Can now be referenced with just `Foo`
但是,规范的某个特定部分指出结构类型不能在它们内部拥有自己的实例(更具体地说,它们表示类型在它们被完全声明之前不能引用它们自己)。
指针形式除外。 这是因为指针在编译开始时是已知的大小,而结构只有在声明它们之后才知道。
由于struct
s早于C ++(仅有一点点)并且自ANSI C(C89)以及之前在大多数主要编译器中都存在,它们也存在于C ++中(因为ANSI C可以在兼容的C ++编译器中优雅地编译)。
但是,C ++添加了C语言中不存在的类的概念。正如其他人所提到的,类和结构类似,因为它们都包含成员。 在C ++中,结构体可以像类一样使用方法 - 显然在C中不是这种情况。
据我所知,唯一的区别是能见度; struct
s默认为public,而class
es默认为private。 C没有可见性的概念。
意味着它的样子。 递归声明只是意味着Node结构有两个字段,这些字段是指向其他节点的指针。
我已经读过C ++中结构和类之间的主要区别是默认权限(默认情况下结构都是公共的)。 稍微简单一点,特别是因为继承不太可能。
struct Node *left, *right;
的含义struct Node *left, *right;
的定义内struct Node
是,每个实例struct Node
包含的成员( left
和right
),该指向其他struct Node
秒。
程序员有责任确保在创建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
(和class
es)能够做许多C struct
不能做的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.