C++程序设计语言学习笔记:结构、联合与枚举

本文详细介绍了C++中的struct结构体,包括其定义、初始化、成员访问以及与class的区别。同时,讲解了枚举类型,包括enumclass的特性以及普通enum的使用。此外,还探讨了union的特性和限制,以及如何在结构体中使用位域。内容涵盖了C++中基本数据类型的组织和管理,以及它们在内存中的表现。
摘要由CSDN通过智能技术生成

1、struct是任意类型元素构成的序列。

struct Address{
    const char* name;    //"Jim Dandy"
    int number;          //61
    const char* street;  //"South St"
    const char* town;    //"New Providence"
    char state[2];       //'N''J'
    const char* zip;     //"07974"
};

2、声明Address类型的变量与声明其他变量的方式一模一样。我们可以用(.)点运算符为每个成员赋值。

void f()
{
    Address jd;
    jd.name = "Jim Dandy";
    jd.number = 61;
}

3、struct类型能使用{}的形式初始化。

Address jd = {
    "Jim Dandy",
    61, "South St",
    "New Providence",
    {'N', 'J'}, "07974"
};

4、我们通常使用->运算符访问结构的内容。

void print_addr(Address* p)
{
    cout << p->name << '\n'
         << p->number << '' << p->street << '\n'
         << p->town << '\n'
         << p->state[0] << p->state[1] << '' << p->zip << '\n';
}

5、我们也能以引用方式传递struct,并使用.运算符访问成员。

void print_addr2(const Address& r)
{
    cout << r.name << '\n'
         << r.number << '' << r.street << '\n'
         << r.town << '\n'
         << r.state[0] << r.state[1] << '' << r.zip << '\n';
}

6、默认情况下,比较运算符(==和!=)等一些是是而非的操作并不使用于结构类型。当然,用户有权自定义这些运算符。

7、对象对齐,说的是一些特定类型的对象,沿着系统结构设定的边界分配空间。

8、struct类型名字只要已出现就能马上使用了,无须等到该类型的声明全部完成。但是只有等他的声明全部完成,才能声明它的对象。

9、struct是一种class,它的成员默认是public的。struct可以包含成员函数,尤其是构造函数。

10、对于两个struct来说,即使他们的成员相同,他们本身扔是不同的类型。

11、平凡构造函数,说的是当一个默认构造函数无须执行任何实际操作时,我们认为它是平凡的。标准布局类型,指的是与C语言的布局兼容的类型,并且应该能被常规的C++应用程序二进制接口(ABI)处理。

12、C++中,将能独立分配和寻址的最小对象组织在一起作为struct的域(field)。域也称为位域(bit-field)。

struct PPN{                   //R6000物理页号
    unsigned int PFN : 22;    //页框编号
    int : 3;                  //未使用
    unsigned int CCA : 3;     //缓存一致性算法
    bool nonreachable : 1;    
    bool dirty : 1;
    bool valid : 1;
    bool global : 1;
};

13、联合,union是一种特殊的struct,它的所有成员都分配在同一个地址空间上。一个union实际占用的空间大小与其最大的成员一样。

14、union是一种特殊的struct,而struct是一种特殊的class。然而很多提供给类的功能与联合无关,因此对union施加了一些限制:

  • union不能含有虚函数。
  • union不能含有引用类型的成员。
  • union不能含有基类。
  • union的成员不能含有用户自定义的构造函数、拷贝操作、移动操作或者析构函数。
  • union的所有成员中,最多只能有一个成员包含类内初始化器。
  • union不能被用作其他类的基类。

15、在类成员中,没有命名的union是一个匿名联合。匿名联合是一个对象而非一种类型,我们无须对象名就能直接访问它的成员。

16、枚举类型用于存放用户指定的一组整数值。枚举类型的每种取值各自对应一个名字,这些值称为枚举值

enum class Color { red, green, blue }

17、枚举类型分为两种:enum class,它的枚举值名字位于enum的作用域内,枚举值不会隐式地转换成其他类型。普通enum,它的枚举值名字与枚举类型本身位于同一个作用域中,枚举值会隐式地转换成整数。因此,更建议使用enum class。

18、enum class是一种限定了作用域的强类型枚举。

19、枚举常用一些整数类型表示,每个枚举值是一个整数。默认情况下,枚举值从0开始。

enum class Warning : int {green, yellow, orange, red};    //sizeof(Warning)==sizeof(int)
enum class Warning : char {green, yellow, orange, red};   //sizeof(Warning)==sizeof(char)

20、普通的enum,是指C++在提出enum class之前提供的枚举类型。普通的enum的枚举值位于enum本身所在的作用域中,他们隐式地转换成某些整数类型的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值