C 语言和C++语言的 struct对比

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)的涅槃

发表于3年前(2012-05-17 00:41)   阅读( 859) | 评论( 12人收藏此文章,我要收藏
赞0

慕课网,程序员升职加薪神器,点击免费学习

从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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值