博客文章: https://blog.manchan.top/post/Differences-between-C-and-Cpp-structures/可在此处找到我
引言
在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。C和C++的主要区别是,C++支持许多附加特性。但是,C++中有许多规则与 C 稍有不同。这些不同使得 C 程序作为C++程序编译时可能以不同的方式运行或根本不能运行。如果使用C++的编译器编译C程序,就知道这些不同之处。
异同点
声明一个有标记的结构或联合后,就可以在C++中使用这个标记作为类型名:
struct duo
{
int a;
int b;
};
struct duo m;
duo n;
结果是结构名会与变量名冲突。例如,下面的程序可作为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);
return 0;
}
在C和C++中,都可以在一个结构的内部声明另一个结构:
struct box
{
struct point
{
int x;
int y;
} upperleft;
struct point lowerright;
};
在C中,随后可以使用任意使用这些结构,但是在C++中使用嵌套结构时要使用一个特殊的符号:
struct box ad;
struct point dot;
box::point dot;
C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。
struct Point
{
int x;
int y;
Point *next;
Point()
{
next = NULL;
x = 0;
y = 0;
}
};
在C中,直接初始化结构数据成员是不可行的,但可以在C ++中完成。
struct Point
{
int x = 0, y = 0;
Point *next = NULL;
void print();
};
利用typedef
在C语言中使用typedef可以在定义变量上达到与C++类似的效果。
如下面在《数据结构》中常用的定义链表的语句,为了同时兼容C和C++,利用typedef 将结构体声明语句取一个别名(即Node 是struct Node 的别名),并设置与结构体与同名,达到C++直接定义变量的效果。
typedef struct Node
{
int data;
struct Node *next;
} Node;
Node list;
而去掉typedef 后,下面的语句是直接定义了一个名为Node 的变量。
struct Node
{
int data;
struct Node *next;
} Node;
|