指针语法C ++

时间:2015-04-11 05:34:20

标签: c++ pointers struct

关于二叉树 - 我已经看到以下代码作为问题解决方案的一部分:

struct Node
{
    int key;
    struct Node *left, *right;
};

我的问题是" struct Node * left,* right"意味着它是在第一个结构节点定义的主体中定义的。另外,如果这是C ++,为什么你会在这里使用struct而不仅仅是class / object?

3 个答案:

答案 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的每个实例都包含指向其他leftright的成员struct Node {1}}秒。

程序员有责任确保在创建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 s(和class es)能够执行C struct不能做的许多其他事情。

相关问题