C 语言和C++语言的 struct对比
C 语言和C++语言的 struct对比
author: stonehat
1. C++语言将struct当成类来处理的,所以C++的struct可以包含C++类的所有东西,例如构造函数,析构函数,友元等,C++的struct和C++类唯一不同就是
struct成员默认的是public, C++默认private。而C语言struct不是类,不可以有函数,也不能使用类的特征例如public等关键字 ,也不可以有static关键字。
2. C++ struct里面成员初始化的形式和类是相同的,不可以直接初始化,就是不可以定义成员的时候同时初始化。C语言 struct中间的某个类型(例如int)也不可以直接初始化。
就是说下面int a = 0;在C++和C语言里面都是不能通过的。
struct HE { int a = 0; }
//C++和C编译是不能通过的。
3. 初始化方式,C++ struct的初始化,C++不仅拥有C语言的初始化方式。如下:
struct HE { int a; }; int main(){ HE d={3}; // 因为 HE在C++是类名,可以省略struct。C语言里面要加上struct 才行。 return 0; }
也可以使用类的初始化方式
struct HE { int a; }; int main(){ HE d; d.a = 3; return 0; }
4. 类型不同,下面代码:
struct HE { int a; };
在C里面实际上数据类型为 (struct HE),所以定义一个结构HE变量都要 带上struct.
struct
HE a;
//C语言 变量方式
|
而在C++里面实际上数据类型为HE(主要是因为结构体被当成类对待了),所以定义变量不需要 struct.
HE a;
//C++语言 变量
|
5. typedef struct 在C++和C语言中都是一样的功能,定义别名。 但是要注意下面的代码的区别
//代码一
#include <stdio.h> #include <stdlib.h> typedef struct HE { int a; } *PHE,DHE,EHE; //这是定义了一个struct HE*类型别名和两个普通别名,main函数只考虑指针型别名。 int main(){ PHE a = (PHE)malloc(sizeof(struct HE)); //这是C语言的写法 //PHE a = new HE(); 这是C++语言的写法 return 0; }
//代码二 #include <stdio.h> #include <stdlib.h> struct HE { int a; } *PHE,DHE,EHE; //这里定义了一个指针型变量和两个普通变量
上面两个代码省略 struct的名字 HE都是可以的。
总结:C++语言因为是和C语言兼容的,所以C语言的语法在C++编译器里不会出错,但是程序员最好知道什么是C语言,什么是C++语言。
pppp
从C到C++——结构体(struct)的涅槃
从C到C++,结构体(struct)涅槃重生,那么,C语言的结构体和C++结构体有什么不同呢,下面是一个测试程序,程序中大量的注释就算作本文的讲解吧!
|
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
/*- ==========================================================
* 文件名 :TestCppStruct.cpp
* 开发人员:袁培荣
* 当前版本:1.0.0.2595
* 创建时间:2012-05-17
* 修改时间:2012-05-17
* 功能说明:C++结构体功能测试
* 版权说明:版权所有 袁培荣 YuanPeirong
* 编译环境:Windows 7(x64) SP1 简体中文专业版
* 编译器: Visual Studio 2010 SP1(中文旗舰版)
MinGW 20111108
Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/
#include <iostream>
using
std::cout;
using
std::endl;
//====================================================================
struct
STest
{
int
a;
char
c;
STest()
{
cout<<
"STest结构体构造函数被执行"
<<endl;
a=10;
c=
'S'
;
};
};
//====================================================================
struct
STest2
{
int
a;
char
c;
STest2();
};
STest2::STest2()
{
cout<<
"STest2结构体构造函数被执行"
<<endl;
a=15;
c=
'T'
;
}
//====================================================================
struct
STest3
{
int
a;
char
c;
void
Test()
{
cout<<
"STest3结构体Test函数被执行"
<<endl;
a=10;
c=
'S'
;
};
};
//====================================================================
struct
STest4
{
int
a;
char
c;
void
Test();
};
void
STest4::Test()
{
cout<<
"STest4结构体Test函数被执行"
<<endl;
a=15;
c=
'T'
;
}
//====================================================================
struct
STest5
{
int
a;
void
Test();
private
:
char
c;
void
Test2();
};
void
STest5::Test()
{
cout<<
"STest5结构体Test函数被执行"
<<endl;
a=16;
c=
'X'
;
}
void
STest5::Test2()
{
cout<<
"STest5结构体Test2函数被执行"
<<endl;
a=17;
c=
'Y'
;
}
//====================================================================
int
main(
int
argc,
char
* argv[])
{
//====================================================================
STest s11;
//在C语言中应为 struct STest s11; 在C++中struct可省略
STest2 s21;
//
cout<<
"s11: "
<<s11.a<<
" "
<<s11.c<<endl;
cout<<
"s21: "
<<s21.a<<
" "
<<s21.c<<endl;
s11.a=100;
s21.c=
'Z'
;
cout<<
"直接修改了s11和s21的值!"
<<endl;
cout<<
"s11: "
<<s11.a<<
" "
<<s11.c<<endl;
cout<<
"s21: "
<<s21.a<<
" "
<<s21.c<<endl;
//====================================================================
// C++的结构体有构造函数,C语言中结构体不能有函数,更别谈构造函数
//====================================================================
//====================================================================
// STest s12={1,'A'};
// STest s22={2,'B'};
// cout<<"s12: "<<s12.a<<" "<<s12.c<<endl;
// cout<<"s22: "<<s22.a<<" "<<s22.c<<endl;
//====================================================================
// error: `s12' must be initialized by constructor, not by `{...}'
// error: `s22' must be initialized by constructor, not by `{...}'
// 结构体一旦有构造函数就不能通过 {...} 方式初始化
//====================================================================
//====================================================================
STest3 s31={1,
'A'
};
STest4 s41={2,
'B'
};
cout<<
"通过 {...} 方式初始化 了s31和s41的值"
<<endl;
cout<<
"s31: "
<<s31.a<<
" "
<<s31.c<<endl;
cout<<
"s41: "
<<s41.a<<
" "
<<s41.c<<endl;
s31.Test();
s41.Test();
cout<<
"s31: "
<<s31.a<<
" "
<<s31.c<<endl;
cout<<
"s41: "
<<s41.a<<
" "
<<s41.c<<endl;
s31.a=100;
s41.c=
'Z'
;
cout<<
"直接修改了s31和s41的值!"
<<endl;
cout<<
"s31: "
<<s31.a<<
" "
<<s31.c<<endl;
cout<<
"s41: "
<<s41.a<<
" "
<<s41.c<<endl;
//====================================================================
// C++的结构体可以有成员函数
// C++的结构体没有构造函数时可以通过 {...} 方式初始化
//====================================================================
//====================================================================
//STest5 s51={5,'A'};
// error: `s51' must be initialized by constructor, not by `{...}'
//s51.Test2();
//error: `void STest5::Test2()' is private
//s51.c='Z';
// error: `char STest5::c' is private
STest5 s52;
s52.a=52;
cout<<
"s52.a="
<<s52.a<<endl;
s52.Test();
cout<<
"s52.a="
<<s52.a<<endl;
s52.a=10;
cout<<
"s52.a="
<<s52.a<<endl;
//====================================================================
// 结构体STest5的测试说明:
// C++中可以为结构体的成员设定访问控制级别 private public protected
// C++中一旦为结构体设定访问控制级别,那么这个结构体其实就是类
// 所以不可以通过 {...} 方式初始化
// 类中的访问控制级别和结构体是一致的,但是缺省时:
// 类中是 private 而结构体中是 public
// 这是唯一的区别
//====================================================================
return
0;
//在C语言和早期C++中此句不可以省略,在标准C++中此句可省略
}
//====================================================================
//运行结果
//====================================================================
// STest结构体构造函数被执行
// STest2结构体构造函数被执行
// s11: 10 S
// s21: 15 T
// 直接修改了s11和s21的值!
// s11: 100 S
// s21: 15 Z
// 通过 {...} 方式初始化 了s31和s41的值
// s31: 1 A
// s41: 2 B
// STest3结构体Test函数被执行
// STest4结构体Test函数被执行
// s31: 10 S
// s41: 15 T
// 直接修改了s31和s41的值!
// s31: 100 S
// s41: 15 Z
// s52.a=52
// STest5结构体Test函数被执行
// s52.a=16
// s52.a=10
//====================================================================
// 总结: C++的结构体可以分两部分来看
// 1.保持和C语言兼容的结构体,不涉及函数
// 2.C++支持的结构体,这种结构类事实上和类class功能相同,但有一点区别
// 区别在于
// 类中默认的访问控制级别为 private
// 结构体中默认的访问控制级别为 public
// 是的,我们可以在编程时用 private public protected来修饰结构体中的成员
// C++的结构体就是C语言的结构体和C++中的类的综合体
//====================================================================
//====================================================================
// 以上测试的错误信息是在MinGW编译器上编译时复制的
// 以上代码在
// Visual Studio 2010 SP1(中文旗舰版)
// MinGW 20111108
// Visual C++ 6.0 SP6(中文企业版)
// 这三个编译器上编译通过
//====================================================================
|
ooo


5552

被折叠的 条评论
为什么被折叠?



