一文搞懂C和C++中struct

1.C中struct

  • 在C中struct只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面。
  • 在C结构体声明中不能使用C++访问修饰符,如:public、protected、private 而在C++中可以使用。
  • 在C中定义结构体变量,如果使用了下面定义必须加struct。
  • C的结构体不能继承(没有这一概念)。
  • 若结构体的名字与函数名相同,可以正常运行且正常的调用!例如:可以定义与 struct Base 不冲突的 void Base() {}。

完整案例:

  1. #include<stdio.h>
  2. struct Base { // public
  3. int v1;
  4. // public: //error
  5. int v2;
  6. //private:
  7. int v3;
  8. //void print(){ // c中不能在结构体中嵌入函数
  9. // printf("%s\n","hello world");
  10. //}; //error!
  11. };
  12. void Base(){
  13. printf("%s\n","I am Base func");
  14. }
  15. //struct Base base1; //ok
  16. //Base base2; //error
  17. int main() {
  18. struct Base base;
  19. base.v1=1;
  20. //base.print();
  21. printf("%d\n",base.v1);
  22. Base();
  23. return 0;
  24. }

最后输出:

  1. 1
  2. I am Base func

完整代码见:struct_func.c

2.C++中struct

与C对比如下:

  • C++结构体中不仅可以定义数据,还可以定义函数。
  • C++结构体中可以使用访问修饰符,如:public、protected、private 。
  • C++结构体使用可以直接使用不带struct。
  • C++继承
  • 若结构体的名字与函数名相同,可以正常运行且正常的调用!但是定义结构体变量时候只用用带struct的!

例如:

情形1:不适用typedef定义结构体别名

未添加同名函数前:

  1. struct Student {
  2. };
  3. Student(){}
  4. Struct Student s; //ok
  5. Student s; //ok

添加同名函数后:

  1. struct Student {
  2. };
  3. Student(){}
  4. Struct Student s; //ok
  5. Student s; //error

情形二:使用typedef定义结构体别名

  1. typedef struct Base1 {
  2. int v1;
  3. // private: //error!
  4. int v3;
  5. public: //显示声明public
  6. int v2;
  7. void print(){
  8. printf("%s\n","hello world");
  9. };
  10. }B;
  11. //void B() {} //error! 符号 "B" 已经被定义为一个 "struct Base1" 的别名

前三种案例

  1. #include<iostream>
  2. #include<stdio.h>
  3. struct Base {
  4. int v1;
  5. // private: //error!
  6. int v3;
  7. public: //显示声明public
  8. int v2;
  9. void print(){
  10. printf("%s\n","hello world");
  11. };
  12. };
  13. int main() {
  14. struct Base base1; //ok
  15. Base base2; //ok
  16. Base base;
  17. base.v1=1;
  18. base.v3=2;
  19. base.print();
  20. printf("%d\n",base.v1);
  21. printf("%d\n",base.v3);
  22. return 0;
  23. }

完整代码见:struct_func.cpp

继承案例

  1. #include<iostream>
  2. #include<stdio.h>
  3. struct Base {
  4. int v1;
  5. // private: //error!
  6. int v3;
  7. public: //显示声明public
  8. int v2;
  9. virtual void print(){
  10. printf("%s\n","Base");
  11. };
  12. };
  13. struct Derived:Base {
  14. public:
  15. int v2;
  16. void print(){
  17. printf("%s\n","Derived");
  18. };
  19. };
  20. int main() {
  21. Base *b=new Derived();
  22. b->print();
  23. return 0;
  24. }

完整代码见:ext_struct_func.cpp

同名函数

  1. #include<iostream>
  2. #include<stdio.h>
  3. struct Base {
  4. int v1;
  5. // private: //error!
  6. int v3;
  7. public: //显示声明public
  8. int v2;
  9. void print(){
  10. printf("%s\n","hello world");
  11. };
  12. };
  13. typedef struct Base1 {
  14. int v1;
  15. // private: //error!
  16. int v3;
  17. public: //显示声明public
  18. int v2;
  19. void print(){
  20. printf("%s\n","hello world");
  21. };
  22. }B;
  23. void Base(){
  24. printf("%s\n","I am Base func");
  25. }
  26. //void B() {} //error! 符号 "B" 已经被定义为一个 "struct Base1" 的别名
  27. int main() {
  28. struct Base base; //ok
  29. //Base base1; // error!
  30. base.v1=1;
  31. base.v3=2;
  32. base.print();
  33. printf("%d\n",base.v1);
  34. printf("%d\n",base.v3);
  35. Base();
  36. return 0;
  37. }

完整代码见:struct_func_func.cpp

3.总结

C和C++中的Struct区别

CC++
不能将函数放在结构体声明能将函数放在结构体声明
在C结构体声明中不能使用C++访问修饰符。public、protected、private 在C++中可以使用。
在C中定义结构体变量,如果使用了下面定义必须加struct。可以不加struct
结构体不能继承(没有这一概念)。可以继承
若结构体的名字与函数名相同,可以正常运行且正常的调用!若结构体的名字与函数名相同,使用结构体,只能使用带struct定义!