C和C++结构体的区别

引言

在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。C和C++的主要区别是,C++支持许多附加特性。但是,C++中有许多规则与 C 稍有不同。这些不同使得 C 程序作为C++程序编译时可能以不同的方式运行或根本不能运行。如果使用C++的编译器编译C程序,就知道这些不同之处。

异同点

声明一个有标记的结构或联合后,就可以在C++中使用这个标记作为类型名:

struct duo
{
    int a;
    int b;
};
struct duo m; /* C和C++都可以 */
duo n; /* C不可以,C++可以*/

结果是结构名会与变量名冲突。例如,下面的程序可作为C程序编译,但是作为C++程序编译时会失败。因为C++把printf()语句中的duo解释成结构类型而不是外部变量:

#include <stdio.h>
float duo = 100.3;
int main(void)
{
    struct duo
    {
        int a;
        int b;
    };
    struct duo y = {2, 4};
    printf("%f\n", duo); /* 在C中没问题,但是在C++不行 */
    return 0;
}

在C和C++中,都可以在一个结构的内部声明另一个结构:

struct box
{
    struct point
    {
        int x;
        int y;
    } upperleft;
    struct point lowerright;
};

在C中,随后可以使用任意使用这些结构,但是在C++中使用嵌套结构时要使用一个特殊的符号:

struct box ad;    /* C和 C++都可以 */
struct point dot;   /* C可以,C++不行 */
box::point dot;    /* C不行,C++可以 */

C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。

struct Point 
{
    int x;
    int y;
    Point *next;
    Point()/* C不行,C++可以 */
    {
        next = NULL;
        x = 0;
        y = 0;
    }//变量初始化函数
};

在C中,直接初始化结构数据成员是不可行的,但可以在C ++中完成。

struct Point 
{
    int x = 0, y = 0;//仅c++可在结构体定义内初始化
    Point *next = NULL;
    void print();
};

利用typedef

在C语言中使用typedef可以在定义变量上达到与C++类似的效果。

如下面在《数据结构》中常用的定义链表的语句,为了同时兼容C和C++,利用typedef将结构体声明语句取一个别名(即Nodestruct Node的别名),并设置与结构体与同名,达到C++直接定义变量的效果。

typedef struct Node
{
    int data;
    struct Node *next;
} Node;
Node list;

而去掉typedef后,下面的语句是直接定义了一个名为Node的变量。

struct Node
{
    int data;
    struct Node *next;
} Node;

GISer, a novice who is learning hard
博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 ( CC 4.0 BY-SA ) 协议
本文永久链接是: https://blog.manchan.top/post/Differences-between-C-and-Cpp-structures/