《C++那些事》项目概要及一文彻底搞懂C和C++中struct
- 2019 年 10 月 6 日
- 筆記
一文搞懂C和C++中struct
最近一直在更新一个仓库:《C++那些事》,将自己学习的难点与重点罗列进去,并配上相关代码,实践与理论结合。
仓库地址:
https://github.com/Light-City/CPlusPlusThings
点击原文也可跳转,如果觉得不错,麻烦点个star!
目前C++那些事更新文章如下:

1.C中struct
- 在C中struct只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面。
- 在C结构体声明中不能使用C++访问修饰符,如:public、protected、private 而在C++中可以使用。
- 在C中定义结构体变量,如果使用了下面定义必须加struct。
- C的结构体不能继承(没有这一概念)。
- 若结构体的名字与函数名相同,可以正常运行且正常的调用!例如:可以定义与 struct Base 不冲突的 void Base() {}。
完整案例:
#include<stdio.h> struct Base { // public int v1; // public: //error int v2; //private: int v3; //void print(){ // c中不能在结构体中嵌入函数 // printf("%sn","hello world"); //}; //error! }; void Base(){ printf("%sn","I am Base func"); } //struct Base base1; //ok //Base base2; //error int main() { struct Base base; base.v1=1; //base.print(); printf("%dn",base.v1); Base(); return 0; }
最后输出:
1 I am Base func
完整代码见:github
2.C++中struct
与C对比如下:
- C++结构体中不仅可以定义数据,还可以定义函数。
- C++结构体中可以使用访问修饰符,如:public、protected、private 。
- C++结构体使用可以直接使用不带struct。
- C++继承
- 若结构体的名字与函数名相同,可以正常运行且正常的调用!但是定义结构体变量时候只用用带struct的!
例如:
情形1:不适用typedef定义结构体别名
未添加同名函数前:
struct Student { }; Student(){} Struct Student s; //ok Srudent s; //ok
添加同名函数后:
struct Student { }; Student(){} Struct Student s; //ok Srudent s; //error
情形二:使用typedef定义结构体别名
typedef struct Base1 { int v1; // private: //error! int v3; public: //显示声明public int v2; void print(){ printf("%sn","hello world"); }; }B; //void B() {} //error! 符号 "B" 已经被定义为一个 "struct Base1" 的别名
前三种案例
#include<iostream> #include<stdio.h> struct Base { int v1; // private: //error! int v3; public: //显示声明public int v2; void print(){ printf("%sn","hello world"); }; }; int main() { struct Base base1; //ok Base base2; //ok Base base; base.v1=1; base.v3=2; base.print(); printf("%dn",base.v1); printf("%dn",base.v3); return 0; }
完整代码见:github
继承案例
#include<iostream> #include<stdio.h> struct Base { int v1; // private: //error! int v3; public: //显示声明public int v2; virtual void print(){ printf("%sn","Base"); }; }; struct Derived:Base { public: int v2; void print(){ printf("%sn","Derived"); }; }; int main() { Base *b=new Derived(); b->print(); return 0; }
完整代码见:github
同名函数
#include<iostream> #include<stdio.h> struct Base { int v1; // private: //error! int v3; public: //显示声明public int v2; void print(){ printf("%sn","hello world"); }; }; typedef struct Base1 { int v1; // private: //error! int v3; public: //显示声明public int v2; void print(){ printf("%sn","hello world"); }; }B; void Base(){ printf("%sn","I am Base func"); } //void B() {} //error! 符号 "B" 已经被定义为一个 "struct Base1" 的别名 int main() { struct Base base; //ok //Base base1; // error! base.v1=1; base.v3=2; base.print(); printf("%dn",base.v1); printf("%dn",base.v3); Base(); return 0; }
完整代码见:github
3.总结
C和C++中的Struct区别
C |
C++ |
---|---|
不能将函数放在结构体声明 |
能将函数放在结构体声明 |
在C结构体声明中不能使用C++访问修饰符。 |
public、protected、private 在C++中可以使用。 |
在C中定义结构体变量,如果使用了下面定义必须加struct。 |
可以不加struct |
结构体不能继承(没有这一概念)。 |
可以继承 |
若结构体的名字与函数名相同,可以正常运行且正常的调用! |
若结构体的名字与函数名相同,使用结构体,只能使用带struct定义! |