C++
文章平均质量分 79
C++中的点点滴滴
_Nino
Master, teaching makes you.
展开
-
C++ 中异常机制的实现机制详解
0x1 C函数的调用和返回0x2 C++函数调用0x3 栈回退(stack unwind)0x4 异常捕获0x5 抛出异常0x6 总结0x1 C函数的调用和返回要理解 C++ 异常机制实现之前,首先要了解一个函数的调用和返回机制,这里面就要涉及到 ESP 和 EBP 寄存器。这两个寄存器是用来维护一个函数栈帧的关键寄存器,我们先看一下函数调用和返回的流程。下面是按函数调用约定 __stdcall 调用函数 test(int p1,int p2) 的汇编代码,假设执行函数前堆栈指针 ESP 为 NN.转载 2021-11-06 21:02:57 · 1188 阅读 · 1 评论 -
从程序语言的角度深入剖析 C++11 中的 lambda 表达式
前言在使用 C++11 的标准库算法的时候,常常需要传入一个可调用对象作为实参,那么到底什么是可调用对象呢?从语法层次来说,能够使用运算符()的对象就是可调用对象,即若 obj 是一个可调用对象,那么语法 obj([arg]) 是合法的。C++11 提供了四种可调用的对象,其中我们用的最多的就是函数和函数指针;通过对类重载函数运算符,该类的对象也是一种可调用对象;还有一种可调用对象就是 lambda 表达式。0x1 从普通函数调用说起...原创 2021-07-04 19:36:23 · 433 阅读 · 0 评论 -
C++ IO 标准库
前言0x1 IO 类型的共性0x1.1 IO 对象不可拷贝或赋值0x1.2 条件状态0x2前言C++ 语言不直接处理输入和输出,而是通过一族定义在标准库中的类型来处理 IO。平时我们用的比较多的 cin 和 cout 就是标准库中的 IO 对象,其直接关联到标准的输入输出,其实标准库还为我们提供了文件 IO 和内存 IO ,通过包含三个独立的头文件,我们则可以使用这些 IO 类型。#include <iostream> :读写流的基本类型,提供了 istream、ostream、ios.原创 2021-06-16 23:55:11 · 456 阅读 · 2 评论 -
C++ 编译器自动生成的函数详解
前言0x1 编译器为我们的类合成了哪些函数?0x2 对象到底调用了哪个函数?前言在定义一个 C++ 类的时候,编译器会为我们做很多事情,比如在某些情况下会为我们合成各种用于初始化、拷贝、移动、赋值操作的函数。那么 C++ 在定义一个类的时候编译器为我们生成了哪些成员函数呢?直接初始化和拷贝初始化调用的构造函数有什么区别吗?此处设计很多知识点,又杂又乱,所以在文章的开始处,我先把结论列出来。编译器可以为我们合成默认构造函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值函数、析构函数。以上提到.原创 2021-06-10 12:42:23 · 1895 阅读 · 0 评论 -
C++ 类类型转换
在 C++ 中,对于一个类来说,根据接收的参数数量和类型不同,可以定义多个构造函数。如果在创建一个类的对象时,不需要输入任何实参作为初始值,此时调用的是默认构造函数。如果将同一个类的另外一个对象作为实参初始值,则调用的称为拷贝构造函数。有一种特殊的构造函数,该类构造函数只接收一个实参,他实际上不仅仅实现了一种初始化对象的方式,而且实现了一种转换为此类类型的转换机制,这种构造函数就被称为转换构造函数。...原创 2021-06-09 20:32:11 · 1894 阅读 · 1 评论 -
C++11 中的 =default 的含义
在 C++ 中,当用户定义一个类的时候,如果没有给类定义任何构造函数,那么编译器会生成一个默认构造函数,使得在定义该类的对象的时候,调用了自动生成的默认构造函数为成员变量执行默认初始化。如果用户在定义一个类的时候,只要定义了任何一个构造函数,编译器则不会再为该类生成默认的构造函数,如果我们还需要一个默认构造函数,则只能自己定义。而在 C++11 新标准中,可以通过 = default 关键来声明构造函数,告诉编译器为该类生成一个默认的版本,由编译器自己生成的默认构造函数,性能上一般会比用户自己定义的更好,而原创 2021-06-06 00:46:58 · 7113 阅读 · 2 评论 -
C++ 中数组指针和函数指针
数组的类型数组指针怎么写声明返回一个数组指针的函数函数的类型函数指针怎么写数组的类型在往常的编程中,我们都知道数组的名字就代表数组第一个元素的地址,这总是让我们对数组的类型产生误解。比如对于这条指令int a[10] = {0}; ,因为当引用数组名 a 的时候往往相当于引用数组第一个元素 a[0] 的地址,所以我们可能会误认为数组 a 的类型是 int *,然而数组名 a 代表的却是整个数组,他的类型并不是简单的 int *,那数组 a 的类型到底是什么呢?我们都知道一个数组的两个特点是存储元素的类.原创 2021-05-27 23:16:55 · 356 阅读 · 0 评论 -
C++ 函数重复声明对默认实参的影响
在C++中,函数只能定义一次,但是可以多次声明,通常函数的默认实参可以在声明中指定,也可以在定义中指定,但是对于同一个参数不能在同一个作用域中指定两次,如以下代码,将会报重复定义错误:int (*func(int a, int b = 10))[10];int (*func(int a, int b = 20))[10];clang输出语法树的报错信息如下:但是在重复声明的时候,可以指定不同默认参数的值,此时第二次声明是在第一次声明的基础上添加默认参数。如以下代码:int (*func(int原创 2021-05-27 16:18:28 · 782 阅读 · 0 评论 -
C++ 中的 sizeof 运算符
sizeof 运算符语法:sizeof (type)sizeof (expr)sizeof exprsizeof 运算符返回一条表达式或一个类型名字所占的字节数,其返回值是 size_t 类型的常量表达式。sizeof 运算符对其作用的类型的依赖:对 char 或者类型为 char 的表达式执行 sizeof 运算,结果是1。对引用类型执行 sizeof 运算得到被引用对象所占空间的大小。对指针执行 sizeof 运算得到指针本身所占空间的大小。对解引用指针执行 sizeof 运算原创 2021-03-21 11:15:42 · 483 阅读 · 0 评论 -
C++ 标准库<cctype>
前言<cctype> 标准库是对于单个字符的处理库,包括字符分类和字符操控两大类函数,这个头文件属于NTBS (Null-terminated byte strings)的一部分,源自于C语言中的标准库 <ctype.h>。概述该库中共有14个函数,其函数签名如下:字符分类前12个函数属于字符分类的函数,其作用如下:isalnum(ch):当ch是字母或者数字时返回一个非零值,否则返回0。字母或数字包括26个大写字母、26个小写字母和10个十进制数字。isalph原创 2021-03-10 15:46:15 · 409 阅读 · 0 评论 -
C++11中的 auto 和 decltype 关键字
C++11中的 auto 和 decltype 关键字auto 关键字0x1 auto 的语法规则0x2 auto的常见用法decltype 关键字0x1 decltype 的语法规则auto 关键字在C++程序中,每个变量都有自己的类型,这就要求变量在声明的时候必须清楚地知道其右侧初始值的类型。然而做到这一点并非易事,有时候甚至无法做到。在C++11之前的版本中,变量在声明或者初始化的时候,必须显式的指定其类型,但是在C++11中引入了 auto 关键字,用它可以让编译器替我们去分析初始值的类型来推原创 2021-03-04 10:25:18 · 182 阅读 · 1 评论 -
为什么在 C++ 中 inline 函数要在头文件中定义
先说结论:inline 函数并不是必须定义在头文件中,但是一个好的工程习惯是定义在头文件中。(核心)inline 函数在链接的时候仅仅在单个 cpp 文件中可见,并不是全局可见。C++中在类中实现的成员函数会被编译器自动默认判定为 inline 函数。对于以下三个文件做测试:test.h// test.h#include <iostream>class Test{public: void func();};test.cpp//test.cpp#include原创 2021-03-03 17:34:30 · 5493 阅读 · 2 评论 -
C++ 中 const 的那些事
C++中 const 的那些事前言0x1 const 和引用0x2 默认状态下,const 对象仅在文件内有效0x3 const 和类型别名0x4 const 和 auto前言cosnt 关键字常被用于定义一个常量,用法较多的可能是定义常量指针、指向常量的指针和指向常量的引用,但是const还是有很多冷门的语法特性,如果使用不当,可能会导致我们写的代码不符合预期,且很难找到错误,因此作如下总结。0x1 const 和引用由于引用本身不是一个对象,所以引用在初始化的时候只能绑定在对象上,而不能与字面原创 2021-03-03 01:22:46 · 374 阅读 · 0 评论 -
深入理解 C++ 中的引用和指针
引用(reference):一个已经存在的对象的别名,引用并非对象。指针(pointer):用来存放地址的一种类型,指向内存中某块存储单元,指针本身就是对象。从引用不是对象,指针是对象来看他们的区别:引用不是一个对象,故程序不会为一个引用分配内存区域;而指针本身就是一个对象,故程序会为指针变量分配内存区域。引用不可以为空,在定义时必须初始化,且之后无法改变;指针可以不初始化(不推荐),在生命周期内可以指向不同的对象。引用只能为一级,指针可以为多级。int **p1; // 合原创 2020-12-15 16:13:52 · 399 阅读 · 0 评论 -
C++ 中的字面值常量
前言一个形如20的值称之为字面值常量(literal),这样的值一望而知。每个字面值常量对应一种数据类型,由其形式和值决定。0x1 整型字面值整型字面值可以写成十进制数、八进制数、或者十六进制数的形式。例如,我们可以用以下任意一种形式来表示数值20:int decimal_literals = 20; //十进制int octal_literals = 024; //八进制int hexadecimal_literals = 0x14; //十六进制默认情况下,十进制字面值的类型是int、原创 2020-12-13 18:21:20 · 1991 阅读 · 1 评论