C语言&C++中易混细节区分
结构体
1.结构体能否为空
- C语言结构体不能为空
- C++结构体可以为空
比较如下:
C语言

C++

2. 结构体中能否有成员函数
- 在C中数据结构和算法是分离的。换句话说就是C语言中的结构体只能定义成员变量,但是不能定义成员函数。
- 在C++中既可以定义成员变量又可以定义成员函数, C++中的结构体和类体现了数据结构和算法的结合。
比较如下:
C语言
#include <stdio.h>
struct node
{
int nValue;
//void show()
//{
// printf("%d",nValue);
//}
};
int main()
{
struct node a;
a.nValue = 100;
printf("%d",a.nValue);
//a.show();
return 0;
}
如果去掉注释编译将提示如下错误:

C++
#include <iostream>
using namespace std;
struct node
{
int nValue;
void show()
{
cout << nValue << endl;
}
};
int main()
{
node a;
a.nValue = 100;
a.show();
return 0;
}

- 不过虽然C语言的结构体中不能定义成员函数,但是却可以定义函数指针,不过函数指针本质上不是函数而是指针,所以总的来说C语言中的结构体只是一个复杂数据类型 ,只能定义成员变量,不能定义成员函数,不能用于面向对象编程。
C结构体中使用函数指针的例子如下:
#include <stdio.h>
struct node
{
int nValue;
void (*pFun)(int);
};
void show(int val)
{
printf("%d",val);
}
int main()
{
struct node a;
a.nValue = 100;
a.pFun = show;
a.pFun(a.nValue);
return 0;
}

3.定义结构体时struct关键字能否省略
- 在C语言中,定义结构体时,
struct关键字不可以省略 - 在C++中,定义结构体时,
struct关键字是可以省略的
比较如下:
C语言
#include <stdio.h>
struct node
{
int nValue;
};
int main()
{
node a;
return 0;
}

C++
#include <iostream>
using namespace std;
struct node
{
int nValue;
};
int main()
{
node a;
return 0;
}
编译成功!
4.扩展:C++中的结构体和类(了解即可,无须深究)
相同之处:
- 结构体中也可以包含函数;
- 也可以定义public、private、protected数据成员;
- 定义了结构体之后,可以用结构体名来创建对象。
- 结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。
总的一句话:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。
两者的区别:
- 成员访问权限以及继承方式:
class中默认的是private,而struct中则是public。 - class还可以用于表示模板类型,struct则不行。
- 类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。
- 效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。
- 关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。
什么时候用struct什么时候用class:
(1)在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct。
(2)在表示数据量大、逻辑复杂的大对象时,首选class。
(3)在表现抽象和多级别的对象层次时,class是最佳选择
函数定义中的缺省值
1.返回值
- 在C语言中,如果返回值未指定时默认是int类型
- 在C++中,如果返回值未指定时默认为void类型
2.参数列表
- 在C语言中,未指定参数列表时,默认可接受任意多个参数
- 有严格的类型检测,没有参数列表的函数默认是void,不接受任意参数
3.缺省参数
- C语言不支持缺省参数
- C++支持缺省参数(如果没有指定实参则使用缺省值,有则使用指定实参)
4.函数重载
- C语言不支持函数重载
- C++支持在同一作用域中存在几个功能类似的

浙公网安备 33010602011771号