c语言 结构体构造函数,从C到C++——结构体(struct)的涅槃

本文通过一个测试程序详细对比了C语言和C++中结构体的不同。C++结构体可以拥有构造函数,而C语言结构体则不能。C++结构体可以有成员函数,并且可以设定访问控制级别,使得结构体具备了类的功能。一旦结构体有构造函数,就不能通过大括号初始化。此外,C++结构体的默认访问级别是public,而C类是private。文章还展示了不同结构体类型的实例和用法,以及在不同编译器下的行为。
摘要由CSDN通过智能技术生成

从C到C++,结构体(struct)涅槃重生,那么,C语言的结构体和C++结构体有什么不同呢,下面是一个测试程序,程序中大量的注释就算作本文的讲解吧!

/*- ==========================================================

* 文件名 :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

using std::cout;

using std::endl;

//====================================================================

struct STest

{

int a;

char c;

STest()

{

cout<

a=10;

c='S';

};

};

//====================================================================

struct STest2

{

int a;

char c;

STest2();

};

STest2::STest2()

{

cout<

a=15;

c='T';

}

//====================================================================

struct STest3

{

int a;

char c;

void Test()

{

cout<

a=10;

c='S';

};

};

//====================================================================

struct STest4

{

int a;

char c;

void Test();

};

void STest4::Test()

{

cout<

a=15;

c='T';

}

//====================================================================

struct STest5

{

int a;

void Test();

private:

char c;

void Test2();

};

void STest5::Test()

{

cout<

a=16;

c='X';

}

void STest5::Test2()

{

cout<

a=17;

c='Y';

}

//====================================================================

int main(int argc, char* argv[])

{

//====================================================================

STest s11; //在C语言中应为 struct STest s11; 在C++中struct可省略

STest2 s21; //

cout<

cout<

s11.a=100;

s21.c='Z';

cout<

cout<

cout<

//====================================================================

// C++的结构体有构造函数,C语言中结构体不能有函数,更别谈构造函数

//====================================================================

//====================================================================

// STest s12={1,'A'};

// STest s22={2,'B'};

// cout<

// cout<

//====================================================================

// 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<

cout<

cout<

s31.Test();

s41.Test();

cout<

cout<

s31.a=100;

s41.c='Z';

cout<

cout<

cout<

//====================================================================

// 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.Test();

cout<

s52.a=10;

cout<

//====================================================================

// 结构体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(中文企业版)

// 这三个编译器上编译通过

//====================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值