繁体   English   中英

指针语法C ++

[英]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包含的成员( leftright ),该指向其他struct Node秒。

程序员有责任确保在创建struct Node ,适当地初始化这些成员。 它们可以设置为NULL (表示它们不指向任何对象)或另一个struct Node的地址。

在C ++中,初始化leftright经常会在构造函数中完成的。 C没有这个特性,因此,每当某些C代码创建struct Node ,它通常必须显式初始化左右成员。

您显示的代码实际上是C,但它将被C ++编译器接受。 C ++允许声明struct Node *left, *right; 省略struct关键字。 C没有。

在C ++中, structclass是相同的 - 不同之处在于成员的可访问性:默认情况下,C ++ struct成员是publicclass成员是private的。 C ++ struct (和class es)能够做许多C struct不能做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM