C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别
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)的区别的更多相关文章
- C++-结构体,联合体,枚举,的区别
结构体: struct NUM { int number; }a; 结构体是声明只是一个模型,没有分配内存空间.当进行定义结构体变量后才分配内存空间 联合体: union data { int a ...
- 《挑战30天C++入门极限》C/C++中结构体(struct)知识点强化
C/C++中结构体(struct)知识点强化 在上一个教程中我们已经简单的阐述了什么是结构体了,为了进一部的学习结构体这一重要的知识点,我们今天来学习一下链表结构. 结构体可以看做是一种自定义 ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
- (转) C/C++中结构体(struct)知识点强化
本文转载于 http://pcedu.pconline.com.cn/empolder/gj/c/0503/567942_all.html#content_page_1 所有程序经过本人验证,部分程序 ...
- C/C++中结构体(struct)
c++ 里面struct可以new,另外: C++中,struct关键字与Class关键字基本是一样的,但是,有两点不同 1 struct定义的数据类型里面所有成员默认级别都是共有的,而class里面 ...
- C/C++中结构体struct 的使用
结构(struct) 结构是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合. 结构中可以使用不同的数据类型. 1. 结构说明和结构变量定义 在Turbo C ...
- android109 结构体,联合体,枚举,自定义
#include <stdio.h> #include <stdlib.h> void study(){ printf("吃饭睡觉打李志\n"); } // ...
- c#中结构体(struct)和类(class)的区别
一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...
- C语言中结构体(struct)的几种初始化方法
转自https://www.jb51.net/article/91456.htm 本文给大家总结的struct数据有3种初始化方法 1.顺序 2.C风格的乱序 3.C++风格的乱序 下面通过示 ...
随机推荐
- MNC - Multicast NetCat
MNC - Multicast NetCat 使用nc测试udp多播,总是遇到奇怪的问题,搞的一头雾水.偶然发现了MNC,测试了一下果然好用. 下载地址: https://github.com/mar ...
- 在数据表中添加一个字段的SQL语句怎么写
如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识. 通用式: alter table [表名] add [字段名] 字 ...
- 团队开发(NABC)
特点:这是一个手机软件,能通过通讯录录入生日信息 N(Need需求):现在在交际圈中需要记住越来越多朋友的生日信息 A(Approach做法):由一个简单的闹钟为基础,添加与生日相关的功能,最终实现 ...
- Java基础学习总结--Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换成字节序列的过程称之为对象的序列化 把字节序列恢复为对象的过程称之为对象的反序列化 对象序列化的主要用途: 1)把对象的字节序列永久的保存到硬盘上,通常放在一个文 ...
- Bootstrap入门三:页面排版
在Bootstrap中,页面的排版都是从全局的概念上出发,定制了主体文本.强调文本.标题.Code风格.按钮.表单.表格等格式,并运用CSS3的@font-face和伪元素一起实现了一套icon主题. ...
- 单点登录(iwantmoon.com出品)
早年便听到单点登录,一直因为感觉很简单,就没有动手去弄,正好现在公司有要求,那么OK,直接做了一个单机版的单点登录. 原理,可以参考SSO. Now,我们来看看我的实现吧.看下图 我们平时所做的登录, ...
- 《IT小小鸟》阅读心得
我是一个不爱看书的人,认为看那些又臭又长废话连篇的书是在浪费时间,但我不认为在那么多的书中没有好书,在一次的职业生涯规划中老师推荐了这本书,一开始认为不值得一看,但还是拿了起来,读了有不少的感触. 书 ...
- 设计模式之建造者模式(Builder)
建造者模式原理:建造模式主要是用于产生对象的各个组成部分,而抽象工厂模式则用于产生一系列对象,建造者模式而且要求这些对象的组成部分有序. 代码如下: #include <iostream> ...
- 【bzoj1005】[HNOI2008]明明的烦恼
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4175 Solved: 1660[Submit][Stat ...
- ```````````````辐射度 Radiometry
solid angel --立体角 单位 sr 球面度 dω就是对solid angel的微分 4π代表一个球 我发现dω就是对半径为1的球的表面积的微分 所以4π代表一个球 这就是球的表面积.. ...