C++ Struct的使用
1. C++中的结构体在C语言中,结构体不能包含函数。 在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。 C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而class中默认是private。 C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。 struct能包含成员函数吗? 能! struct能继承吗? 能!! struct能实现多态吗? 能!!! 2. 结构体的定义与声明实例代码1: 1234567891011struct tag { member-list;}variable-list;/*注:struct为结构体关键字; tag为结构体的标志; member-list为结构体成员变量及成...
C++ bind的使用
1. 可调用对象可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型; 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针; C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。 不同类型可能具有相同的调用形式,如: 123456789101112// 普通函数int add(int a, int b){return a+b;} // lambda表达式auto mod = [](int a, int b){ return a % b;}// 函数对象类struct divide{ int operator()(int denominator, int divisor){ return denominator/divisor; }}; 上述三种可调用对象虽然类型不同,但是共享了一种调用形式:...
C++ stdbind的使用
1. 可调用对象可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型; 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针; C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。 不同类型可能具有相同的调用形式,如: 123456789101112// 普通函数int add(int a, int b){return a+b;} // lambda表达式auto mod = [](int a, int b){ return a % b;}// 函数对象类struct divide{ int operator()(int denominator, int divisor){ return denominator/divisor; }}; 上述三种可调用对象虽然类型不同,但是共享了一种调用形式:...
深入理解C++11
1. 前言1.1. 说到C++11,应该想到什么? 什么是 lambda,及怎么样使用它是最好的? decltype 和 auto 类型推导有什么关系? 什么是移动语义,以及(右值引用)是如何解决转发问题的? default/deleted 函数以及 override 是怎么回事? 异常描述符被什么替代了? noexcept 是如何工作的? 什么是原子类型以及新的内存模型? 如何在 C++11 中做并行编程? 1.2. 语言的哪些关键字和C++11有关? alignas alignof decltype auto(重新定义) static_assert using(重新定义) noexcept export(弃用,不过未来可能留作他用) nullptr constexpr thread_local 2. 保证稳定性和兼容性2.1. 将C99标准纳入C++112.1.1. 确定编译环境的预定义宏 STDC_HOSTED:编译器的目标系统环境中是否包含完整的C库 STDC:编译器对于标准C库的实现是否和C标准一致(是否定义、如何定义由编译器决定) STDC_VERSI...
C++ Primer Plus笔记
1. 预备知识1.1. 如何运行C++程序 使用文本编辑器编写程序,保存文件,这个文件就是源代码。 编译源代码。运行程序将源代码翻译为机器语言。翻译后的文件就是目标代码。 将目标代码与其他代码链接起来,生成程序的运行阶段版本。最终产品文件为可执行代码。 链接指的是将目标代码同使用的函数的目标代码以及一些标准的启动代码组合起来,生成程序的运行阶段版本 编程步骤如下图: 从4.2版起,g++要求编译源代码文件时使用标记-std=c++0x: g++ -std=C++11 use_auto.cpp 2. 开始学习C++2.1. 为什么main()不能使用其他名称?C++程序必须包含一个名为main()的函数, 这是由系统的C++运行时决定的。编译器生成目标系统的可执行文件时,操作系统的启动入口就是C++运行时,然后运行时完成初始化之后就会调用main函数(入口点)。 存在一些例外情况:比如windows上编写DLL模块,是因为DLL模块不是独立的程序。 2.2. cin不支持录入空格在C++中,用cin>>str;这种方法来接收字符串那么录入的...
C语言宏的特殊用法和几个坑
总结一下C语言中宏的一些特殊用法和几个容易踩的坑。由于本文主要参考GCC文档,某些细节(如宏参数中的空格是否处理之类)在别的编译器可能有细微差别,请参考相应文档。 1. 宏基础宏仅仅是在C预处理阶段的一种文本替换工具,编译完之后对二进制代码不可见。基本用法如下: 1.1. 标示符别名1#define BUFFER_SIZE 1024 预处理阶段,foo = (char *) malloc (BUFFER_SIZE);会被替换成foo = (char *) malloc (1024); 宏体换行需要在行末加反斜杠\ 123#define NUMBERS 1, \ 2, \ 3 预处理阶段int x[] = { NUMBERS };会被扩展成int x[] = { 1, 2, 3 }; 1.2. 宏函数宏名之后带括号的宏被认为是宏函数。用法和普通函数一样,只不过在预处理阶段,宏函数会被展开。优点是没有普通函数保存寄存器和参数传递的开销,展开后的代码有利于CPU cache的利用和指令预测,速度快。缺点是可执行代...
《明解C语言》读书笔记
1. 第一章 初识C语言1.1. 转义字符1.1.1. 响铃🔔: \a 12345678#include <stdio.h>int main(void){ char *name = "Evan"; printf("Hello, %s!\a\a\a\n", name); return 0;} 1.2. 通过键盘输入和显示1.2.1. scanf123456789#include <stdio.h>int main(int argc, const char * argv[]) { int number; printf("Please input a number: \n"); scanf("%d", &number); printf("Your number is %d\n", number); return 0;} 1.2.2. puts 123456789101112#include <stdio.h>int main(int argc, const char *...
《图解编译原理》读书笔记
1. 第一章 运行时结构及编译过程1.1. 一个简单的C程序代码如下: 12345678910111213141516int fun(int a, int b);int m = 10;int main(){ int i = 4; int j = 5; m = fun(i, j); return 0;}int fun(int a, int b){ int c = 0; c = a + b; return c;} 1.2. 程序运行之前执行程序之前,我们需要对程序进行编译。 编译分为以下几个步骤: 1. 预处理: 宏定义展开、头文件展开、条件编译、在这里并不会检查语法。 2. 编译: 检查语法,将预处理后的文件编译生成汇编文件 3. 汇编: 将汇编文件生成目标文件(二进制文件) 4. 链接: 将目标文件链接为可执行文件 编译完成生成可执行文件之后,我们通过在linux下size命令可以查看一个可执行二进制文件基本情况: 通过上图可以得知,在程序没有运行前,也就是说程序没有加载到内存前,可执行程序的内部已经分好了3段信息,分别为代码区(...
图解霍夫曼编码
1. 霍夫曼编码今天来给大家普及一下霍夫曼编码(Huffman Coding),一种用于无损数据压缩的熵编码算法,由美国计算机科学家大卫·霍夫曼在 1952 年提出——这么专业的解释,不用问,来自维基百科了。 说实话,很早之前我就听说过霍夫曼编码,除了知道它通常用于 GZIP、BZIP2、PKZIP 这些常规的压缩格式中,我还知道它通常用于压缩重复率比较高的字符数据。 大家想啊,英文就 26 个字母进行的无限组合,重复率高得一逼啊!常用的汉字也不多,2500 个左右,别问我怎么知道的,我有问过搜索引擎的。 字符重复的频率越高,霍夫曼编码的工作效率就越高! 是时候,和大家一起来了解一下霍夫曼编码的工作原理啦,毕竟一名优秀的程序员要能做到知其然知其所以然——请允许我又用了一次这句快用臭了话。 假设下面的字符串要通过网络发送。 大家应该知道,每个字符占 8 个比特,上面这串字符总共有 15 个字符,所以一共要占用 15*8=120 个比特。没有疑问吧?有疑问的同学请不好意思下。 如果我们使用霍夫曼编码的话,就可以将这串字符压缩到一个更小的尺寸。怎么做到的呢? 霍夫曼编码首先会使...
探索Notion中节省时间的神器 - Button
Notion按钮可插入块、添加页面、编辑页面、打开页面等功能,帮助快速完成重复任务、管理项目,提升效率,成为节省时间的实用工具,高效使用。





