1.C中struct
在C中struct只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面。
在C结构体声明中不能使用C++访问修饰符,如:public、protected、private 而在C++中可以使用。
在C中定义结构体变量,如果使用了下面定义必须加struct。
C的结构体不能继承(没有这一概念)。
若结构体的名字与函数名相同,可以正常运行且正常的调用!例如:可以定义与 struct Base 不冲突的 void Base() {}。
完整案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include<stdio.h>
struct Base { int v1;
int v2; int v3; };
void Base(){ printf("%s\n","I am Base func"); }
int main() { struct Base base; base.v1=1; printf("%d\n",base.v1); Base(); return 0; }
|
最后输出:
1
I am Base func
2.C++中struct
与C对比如下:
C++结构体中不仅可以定义数据,还可以定义函数。
C++结构体中可以使用访问修饰符,如:public、protected、private 。
C++结构体使用可以直接使用不带struct。
C++继承
若结构体的名字与函数名相同,可以正常运行且正常的调用!但是定义结构体变量时候只用用带struct的!
例如:
情形1:不适用typedef定义结构体别名
未添加同名函数前:
1 2 3 4 5 6
| struct Student {
}; Student(){} Struct Student s; Student s;
|
添加同名函数后:
1 2 3 4 5 6
| struct Student {
}; Student(){} Struct Student s; Student s;
|
情形二:使用typedef定义结构体别名
1 2 3 4 5 6 7 8 9 10
| typedef struct Base1 { int v1;
int v3; public: int v2; void print(){ printf("%s\n","hello world"); }; }B;
|
//void B() {} //error! 符号 “B” 已经被定义为一个 “struct Base1” 的别名
前三种案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include<iostream> #include<stdio.h>
struct Base { int v1;
int v3; public: int v2; void print(){ printf("%s\n","hello world"); }; };
int main() { struct Base base1; Base base2; Base base; base.v1=1; base.v3=2; base.print(); printf("%d\n",base.v1); printf("%d\n",base.v3); return 0; }
|
继承案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include<iostream> #include<stdio.h> struct Base { int v1;
int v3; public: int v2; virtual void print(){ printf("%s\n","Base"); }; }; struct Derived:Base {
public: int v2; void print(){ printf("%s\n","Derived"); }; }; int main() { Base *b=new Derived(); b->print(); return 0; }
|
同名函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include<iostream> #include<stdio.h>
struct Base { int v1;
int v3; public: int v2; void print(){ printf("%s\n","hello world"); }; };
typedef struct Base1 { int v1;
int v3; public: int v2; void print(){ printf("%s\n","hello world"); }; }B; void Base(){ printf("%s\n","I am Base func"); }
int main() { struct Base base; base.v1=1; base.v3=2; base.print(); printf("%d\n",base.v1); printf("%d\n",base.v3); Base(); return 0; }
|
3.总结
C和C++中的Struct区别
C |
C++ |
不能将函数放在结构体声明 |
能将函数放在结构体声明 |
在C结构体声明中不能使用C++访问修饰符。 |
public、protected、private 在C++中可以使用。 |
在C中定义结构体变量,如果使用了下面定义必须加struct。 |
可以不加struct |
结构体不能继承(没有这一概念)。 |
可以继承 |
若结构体的名字与函数名相同,可以正常运行且正常的调用! |
若结构体的名字与函数名相同,使用结构体,只能使用带struct定义! |
— |
|
4.struct与class区别
总的来说,struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。
区别:
最本质的一个区别就是默认的访问控制
默认的继承访问权限。struct 是 public 的,class 是 private 的。
struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。