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
将结构体声明语句取一个别名(即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;
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/