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 { // public
int v1;
// public: //error
int v2;
//private:
int v3;
//void print(){ // c中不能在结构体中嵌入函数
// printf("%s\n","hello world");
//}; //error!
};

void Base(){
printf("%s\n","I am Base func");
}
//struct Base base1; //ok
//Base base2; //error
int main() {
struct Base base;
base.v1=1;
//base.print();
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; //ok
Student s; //ok

添加同名函数后:

1
2
3
4
5
6
struct Student {

};
Student(){}
Struct Student s; //ok
Student s; //error

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

1
2
3
4
5
6
7
8
9
10
typedef struct Base1 {         
int v1;
// private: //error!
int v3;
public: //显示声明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;
// private: //error!
int v3;
public: //显示声明public
int v2;
void print(){
printf("%s\n","hello world");
};
};

int main() {
struct Base base1; //ok
Base base2; //ok
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;
// private: //error!
int v3;
public: //显示声明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;
// private: //error!
int v3;
public: //显示声明public
int v2;
void print(){
printf("%s\n","hello world");
};
};

typedef struct Base1 {
int v1;
// private: //error!
int v3;
public: //显示声明public
int v2;
void print(){
printf("%s\n","hello world");
};
}B;
void Base(){
printf("%s\n","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("%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 的。

最后更新: 2022年09月29日 19:37

原始链接: https://yang-xiaofeng1101.github.io/2020/06/17/struct/

× 请我吃糖~
打赏二维码