C++对C语言的结构、联合、枚举 这3种数据类型进行了扩展。

1、C++定义的结构名、联合名、枚举名 都是 类型名,可以直接用于变量的声明或定义。即在C++中定义变量时不必在结构名、联合名、枚举名 前加上前缀struct、union、enum。

例如有如下头文件(head.h)

//head.h

enum color {red,blak,white,blue,yellow};

struct student {char name[]; int age; int num;};

union score {int i_sc; float f_sc;}; 

在C中使用的使用的方法

#include "head.h"
int main(void)
{
enum color en_col;
struct student st_stu;
union score un_sc; //....
return ;
}

在C++中使用的使用的方法

#include "head.h"

int main(void)
{
color en_col;
student st_stu;
score un_sc; //....
return ;
}

在C语言中定义这3种变量显得很麻烦,在C中通常使用typedef来达到和C++一样的效果

//example.c

typedef enum _color {red,blak,white,blue,yellow}color;
typedef struct _student {char name[]; int age; int num;}student;
typedef union _score {int i_sc; float f_sc;} score; int main(void)
{
color en_col;
student st_stu;
score un_sc; //....
return ;
}

2、C++中的结构体 和 联合体 中可以定义函数。

下面是一个简单的例子

//example2.cpp

#include <iostream>
using namespace std; struct student
{
char name[];
int age;
char* GetName(void){return name;};
int GetAge(void){return age;};
};
union score
{
int i_sc;
float f_sc;
int GetInt(void){return i_sc;};
float GetFloat(void){return f_sc;};
}; int main(void)
{
student st_stu = {"Lubin", };
score un_sc = {}; cout << st_stu.GetName() << endl;
cout << st_stu.GetAge() << endl;
cout << un_sc.GetInt() << endl; return ;
}
/* 输出结果
Lubin */

2.1 C++中struct 和 class 的区别

在C++中struct也是一种类,他与class具有相同的功能,用法完全相同。

唯一的区别就是:在没有指定成员的访问权限时,struct中默认为public权限,class中默认为private权限。

2.2 C++中的 union 和 class 的区别

union可以定义自己的函数,包括 constructor 以及 destructor。
union支持 public , protected 以及 private 权限。

读者看到这可能会问,要是这样的话,union与class还有什么区别吗?区别当然还是有的

1. union不支持继承。也就是说,union既不能有父类,也不能作为别人的父类。

2. union中不能定义虚函数。

3.在没有指定成员的访问权限时,union中默认为public权限

4.union中的成员类型比class少,具体见2.2.1节

2.2.1 C++中的 union 不能存放的成员类型

联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。

不是所有类都能作为union的成员变量,如果一个类,包括其父类,含有自定义的constructor,copy constructor,destructor,copy assignment operator(拷贝赋值运算符), virtual function中的任意一个,

那么这种类型的变量不能作为union的成员变量,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

2.2.2 C++中的 union 的匿名联合(屠龙之术 - 一辈子都可能不会用到)

如果我们在定义union的时候没有定义名字,那么这个union被称为匿名union(anonymous union)。

匿名联合仅仅通知编译器它的成员变量共同享一个地址,并且变量本身是直接引用的,不使用通常的点号运算符语法.

匿名union的特点如下:

1. 匿名union中不能定义static变量。
2. 匿名union中不能定义函数。
3. 匿名union中不支持 protected 以及 private 权限。
4. 在全局域以及namespace中定义的匿名union只能是static的,否则必须放在匿名名字空间中。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

参考资料:

<<C++面向对象程序设计(第二版)>>

http://blog.csdn.net/marrco2005/article/details/1657160

http://zwkufo.blog.163.com/blog/static/25882512010729101816347/

http://blog.csdn.net/syhhl007/article/details/4678786

C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别的更多相关文章

  1. C++-结构体,联合体,枚举,的区别

    结构体: struct  NUM { int number; }a; 结构体是声明只是一个模型,没有分配内存空间.当进行定义结构体变量后才分配内存空间 联合体: union  data { int a ...

  2. 《挑战30天C++入门极限》C/C++中结构体(struct)知识点强化

        C/C++中结构体(struct)知识点强化 在上一个教程中我们已经简单的阐述了什么是结构体了,为了进一部的学习结构体这一重要的知识点,我们今天来学习一下链表结构. 结构体可以看做是一种自定义 ...

  3. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

  4. (转) C/C++中结构体(struct)知识点强化

    本文转载于 http://pcedu.pconline.com.cn/empolder/gj/c/0503/567942_all.html#content_page_1 所有程序经过本人验证,部分程序 ...

  5. C/C++中结构体(struct)

    c++ 里面struct可以new,另外: C++中,struct关键字与Class关键字基本是一样的,但是,有两点不同 1 struct定义的数据类型里面所有成员默认级别都是共有的,而class里面 ...

  6. C/C++中结构体struct 的使用

    结构(struct)      结构是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合.  结构中可以使用不同的数据类型.      1. 结构说明和结构变量定义      在Turbo C ...

  7. android109 结构体,联合体,枚举,自定义

    #include <stdio.h> #include <stdlib.h> void study(){ printf("吃饭睡觉打李志\n"); } // ...

  8. c#中结构体(struct)和类(class)的区别

    一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...

  9. C语言中结构体(struct)的几种初始化方法

    转自https://www.jb51.net/article/91456.htm     本文给大家总结的struct数据有3种初始化方法 1.顺序 2.C风格的乱序 3.C++风格的乱序 下面通过示 ...

随机推荐

  1. 实体框架 (EF) 入门 => 一、我该用哪个工作流?

    入门的参考资料:http://msdn.microsoft.com/zh-cn/data/ee712907 本篇的参考资料:http://msdn.microsoft.com/zh-cn/data/j ...

  2. js之Function原型

    在ECMAScript中,Function(函数)类型实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象 ...

  3. 四则运算出题器(C++)-BUG修复

    定制题目数量这个功能测试: (1)输入题目数为负数时: 可正确处理: (2)输入题目数量为0时: 可正确处理: (3)输入题目数量为小数时: 程序运行出错: 错误分析: 因为代码中题目数量的变量Que ...

  4. nodeJs爬虫获取数据

    var http=require('http'); var cheerio=require('cheerio');//页面获取到的数据模块 var url='http://www.jcpeixun.c ...

  5. WinForm Control - DataGridView

    http://blog.csdn.net/fangxing80/article/details/1561011 .NET 2.0 - WinForm Control - DataGridView 编程 ...

  6. 【BZOJ】【2245】【SDOI2011】工作安排

    网络流/费用流 裸题吧……直接建模就好了……所谓的“分段函数”就是吓唬你的,其实就是对于每个人分开建几条流量不同.费用不同的弧而已. 对每种产品,连S->i ,(c[i],0):对每个工作人员 ...

  7. 【BZOJ】【2661】【Beijing WC2012】连连看

    网络流/费用流/二分图最大权匹配 拆点费用流求最大权匹配……为什么我拿zyf和Hzwer的代码也交不过去……WA了那么多次……so sad 求路过的神牛指导啊>_<万分感谢 //BZOJ ...

  8. SQL Server优化

    虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决. 查询速度慢的原因很多,常见如下几种: 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) I/ ...

  9. [Shoi2007]Bookcase 书柜的尺寸 dp

    这道dp算是同类型dp中比较难的了,主要难点在于设置状态上: 如果像平时那样设置,必定爆空间没商量: 下面是一种思路: 先把输入进来的数据按h从大到小排序,这样就可以大大减少状态数, 然后设f[i][ ...

  10. ubuntu1404_server搭建lamp

    ubuntu server版可直接一键安装lamp环境 apt-get install lamp-server^ 根据提示输入所需设置密码即可,其配置文件跟编译安装的apached等区别很大 apac ...