C++基础语法梳理:位域以及 union 联合!小知识分享

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++基础语法梳理:位域以及 union 联合!小知识分享相关的知识,希望对你有一定的参考价值。

位域

Bit mode:2;//mode 占 2 位

类可以将其(非静态)数据成员定义为位域(bit-field),在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递二进制数据时,通常会用到位域。

位域在内存中的布局是与机器有关的

位域的类型必须是整型或枚举类型,带符号类型中的位域的行为将因具体实现而定

取地址运算符(&)不能作用于位域,任何指针都无法指向类的位域

extern "C"

(1)被 extern 限定的函数或变量是 extern 类型的

(2)被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的

extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。

extern "C" 使用

#ifdef __cplusplus
extern "C" {
#endif

void *memset(void *, int, size_t);

#ifdef __cplusplus
}
#endif

struct 和 typedef struct

C 中

// c
typedef struct Student {
    int age; 
} S;

等价于

// c
struct Student { 
    int age; 
};

typedef struct Student S;

此时 S 等价于 struct Student,但两个标识符名称空间不相同。

另外还可以定义与 struct Student 不冲突的 void Student() {}。

C++ 中

由于编译器定位符号的规则(搜索规则)改变,导致不同于C语言。

一、如果在类标识符空间定义了 struct Student {...};,使用 Student me; 时,编译器将搜索全局标识符表,Student 未找到,则在类标识符内搜索。

即表现为可以使用 Student 也可以使用 struct Student,如下:

// cpp
struct Student { 
    int age; 
};

void f( Student me );       // 正确,"struct" 关键字可省略

二、若定义了与 Student 同名函数之后,则 Student 只代表函数,不代表结构体,如下:

typedef struct Student { 
    int age; 
} S;

void Student() {}           // 正确,定义后 "Student" 只代表此函数

//void S() {}               // 错误,符号 "S" 已经被定义为一个 "struct Student" 的别名

int main() {
    Student(); 
    struct Student me;      // 或者 "S me";
    return 0;
}

C++ 中 struct 和 class

总的来说,struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。

区别

最本质的一个区别就是默认的访问控制

(1)默认的继承访问权限。struct 是 public 的,class 是 private 的。

(2)struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。

union 联合

联合(union)是一种节省空间的特殊的类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。联合有如下特点:

默认访问控制符为 public

可以含有构造函数、析构函数

不能含有引用类型的成员

不能继承自其他类,不能作为基类

不能含有虚函数

匿名 union 在定义所在作用域可直接访问 union 成员

匿名 union 不能包含 protected 成员或 private 成员

全局匿名联合必须是静态(static)的

union 使用

#include<iostream>

union UnionTest {
    UnionTest() : i(10) {};
    int i;
    double d;
};

static union {
    int i;
    double d;
};

int main() {
    UnionTest u;

    union {
        int i;
        double d;
    };

    std::cout << u.i << std::endl;  // 输出 UnionTest 联合的 10

    ::i = 20;
    std::cout << ::i << std::endl;  // 输出全局静态匿名联合的 20

    i = 30;
    std::cout << i << std::endl;    // 输出局部匿名联合的 30

    return 0;
}

C 实现 C++ 类

C 实现 C++ 的面向对象特性(封装、继承、多态)

(1)封装:使用函数指针把属性与方法封装到结构体中

(2)继承:结构体嵌套

(3)多态:父类与子类方法的函数指针不同

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:904329806点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

以上是关于C++基础语法梳理:位域以及 union 联合!小知识分享的主要内容,如果未能解决你的问题,请参考以下文章

Mysql联合查询union和union all的使用介绍

C语言union和位域

08-mysql基础-mysql中的DQL-联合查询

C++基础语法梳理:进程与线程!知识点详细梳理

C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?

C++:特殊工具与技术之union(联合-共用体)