- 博客(35)
- 收藏
- 关注
原创 C++11 =default与=delete
C++中,如果没有显式定义某些特殊成员函数时,编译器会自动为类生成这些成员函数。例如:我们想在定义Point对象时对_x、_y初始化,于是我们自己写一个构造函数,但代码中如有使用之前编译器生成默认构造函数则会编译失败。如果某个类或函数是这个类的友元,那么可以访问该类私有的拷贝构造(赋值)函数,但是我们并没有实现这个函数,程序最后会在链接阶段报错。因为类的特殊成员函数是明确做某事的,所以编译器能够帮你实现。但是对于普通函数来说,编译器不知道你这个函数要干嘛,所以不能够帮你实现。只能适用于类的特殊成员函数,
2025-01-05 12:04:43
411
原创 C/C++ 对sizeof返回值类型不了解带来的陷阱
带来的陷阱还有许多,在此不做探讨,本文只举例最让人忽视的一种情况,下面这个程序的作者希望输出数组中的所有元素,运行后他却没有得到他想要的结果,程序没有输出任何内容,这是为什么呢?d为int类型,使用d与无符号整数比较时,d会被隐式类型转换为无符号整数。返回的是无符号整数类型,当与有符号整数或其他类型进行比较,且这个有符号数的值可能为负数时,会带来不可预料的后果。时,它只会返回表达式计算结果的类型大小,但它不会对表达式求值。可以访问该程序作者的博客,他还有许多这种类似的陷阱程序。是一个 C/C++中的。
2024-12-26 17:25:19
264
翻译 可能是最好的RPC中文文档
一个计算机通信协议,基于扩展常规或本地过程调用的概念。因此被调用过程不必与调用过程存在于同一地址空间中。这两个进程可能位于同一系统上,也可能位于不同的系统上,并通过网络连接它们。程序员就像调用本地程序一样,无需额外地为这个交互编程(无需关注细节)。上图表示两个联网系统之间 RPC 调用流程。客户端进行过程调用,向服务器发送请求并阻塞等待,直到收到答复或请求超时。当请求到达时,服务器执行对应的请求过程,并将执行结果发送给客户端。客户端收到应答消息后被唤醒继续运行。被调用过程的唯一规范。
2024-11-29 17:28:14
180
原创 C++多态
时,我们本意根据指针(引用)指向的对象类型来选择对应的析构函数,但结果是根据指针(引用)的类型的来选择对应的析构函数,导致对象没有正确的析构,存在资源泄漏。基类析构函数与派生类析构函数名明显不相同,编译器为了支持析构函数能为虚函数,对析构函数名做了特殊处理,编译后析构函数的名统一处理成destructor。使用基类的指针或引用调用同一方法时,产生不同的行为,这是一种动态多态,大多数C++编译器通过虚函数实现。前文中提到析构函数是可以为虚函数的,尤其是存在继承关系的时候,建议将基类析构函数定义为虚函数。
2024-08-13 23:07:42
1031
原创 C++ 继承
继承(Inheritance)是面向对象编程程序设计(OOP)的一个重要特征。,并可以在此基础上修改已有的功能或增加新的功能。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程,继承是类设计层次的代码复用。
2024-08-12 00:12:02
701
原创 C++ auto与decltype及函数返回类型后置
前言:在早期C/C++中auto关键字的作用是:一个存储类型指示符,使用auto修饰的变量,存储类型为自动存储期,从变量声明处生命周期开始,出变量所在代码块生命周期结束,并且。但是局部变量的生命周期本来就是进入作用域生命周期开始,出作用域生命周期结束。,处于一个尴尬地步。
2024-04-24 21:38:41
1035
原创 C语言 预编译详解
C语言 预编译详解一、 预定义符号二、 #define 宏定义2.1 定义不带参数的宏2.2 定义带参数宏2.2.1 小技巧2.3 #define 替换规则2.3.1 # 作用2.3.2 ## 作用 编译C程序涉及很多步骤,第1个步骤就是预编译(预处理)阶段,预编译是在源代码编译之前做一些文本性质的操作。包括删除注释、执行预处理指令。为了观察预编译阶段所做的事,环境使用Linux系统下的GCC编译器一、 预定义符号ANSI C定义了一些预定义符号,它们表示不同含义__FILE__ :进行编译的源文件
2022-04-17 12:50:00
11762
13
原创 C语言 程序的编译、链接、执行
C语言 程序的编译、链接、执行一、 程序的环境1.1 方式一1.2 方式二一、 程序的环境 在ANSI C的任何一种实现中,存在两种不同环境。第1种是翻译环境,在这个环境中源代码文件被转换为可执行的机器指令(二进制代码)。第2种是执行环境,它用于实际执行代码。标准规定,这两种环境可以不在同一台计算机上,即可以在计算机A中编译程序,在计算机B中执行程序。对于这两种环境按步骤细节有两种划分方式1.1 方式一方式一将翻译环境按步骤细分为编译、链接两步,运行环境不变。这就是我们常说的程序的编译、链接、执行
2022-04-14 00:50:46
4715
2
原创 C语言 文件
C语言 文件一、文件1.1 什么是文件1.2 文件名二、 文件流的打开与关闭2.1 流2.2一、文件1.1 什么是文件 磁盘文件在DOS管理中被定义为存贮在外部介质上的程序或数据的集合,是一批逻辑上有联系的数据。每个文件都有个文件名作为标识,每个文件在磁盘中的具体存放位置、格式都由操作系统中的文件系统管理,也就是说,操作系统是以文件为单位对程序或数据进行管理的。 在C语言中文件的含义更为广泛,不仅包含以上所述的磁盘文件,还包括一切能进行输入/输出的终端设备,它们被看成是设备文件。如键盘常称为标准输入
2022-04-10 11:23:44
2003
原创 C语言 查看库函数执行失败原因
C语言 显示库函数执行失败信息一、 errno 是什么二、 strerror函数三、 perror函数一、 errno 是什么C语言提供了许多库函数方便我们使用。当一个库函数执行失败时候,可以查看errno对应的错误信息了解库函数执行失败准确原因。errno:错误代码,一个int类型变量,在errno.h中定义,每个错误代码对应一个错误信息字符串,任何库函数都可以将其值修改为不同于零的某个值,通常用于指示特定类别的错误信息注意:只有当一个库函数执行失败时,才会设置errno。当库函数成功执行时,er
2022-04-08 12:02:48
2642
原创 C语言 动态内存分配
C语言 动态内存分配一、动态内存分配函数1.1 malloc和free函数前言:之前学习了数组,数组的元素储存在内存中连续位置。在声明数组时必须要指定数组的元素个数,即数组空间大小在声明时已经确定了。但是需存放的元素个数常常在运行时才能知道(取决于输入的数据)。这会有几个缺点:1. 当输入元素个数大于数组声明的元素个数时会带来意想不到错误 2. 当输入元素个数小于数组声明的元素个数时会带来内存空间的浪费 3. 数组大小不能动态调整。C语言提供了相关的动态内存分配函数,需要多大内存空间就分配多大内存空间,
2022-03-28 19:14:28
7149
2
原创 C语言 结构体与位段
C语言 结构体与位段一、结构体1.1 结构体是什么1.2 结构体声明1.3 结构体的特殊声明1.4 结构体的成员1.4 结构体变量的定义和初始化一、结构体1.1 结构体是什么 在之前C语言学习中我们接触了整形类型、浮点型类型、指针类型、数组类型等,但是我们发现要描述一个复杂对象的时候,如描述一个人,需要有姓名、身高、年龄、体重等属性,并且每个属性可能是不一样的数据类型。我们发现之前学习的数据类型都无法满足。学过面向对象编程语言的肯定会想到通过定义对象来实现,在C语言中我们通过结构体来实现上述功能。结
2022-03-18 12:46:00
1478
原创 C语言 内存函数
C语言 内存函数一、内存复制函数1.1 memcpy函数1.2 memmove函数二、内存比较函数 memcmp三、内存查找字符函数 memchr四、内存设置函数 memset前言:C语言提供了许多与内存相关函数,可以在头文件<string.h>中查看函数声明,本章将会自行编写相关内存函数一、内存复制函数1.1 memcpy函数功能:将num字节的值从source指向的位置直接拷贝到destination指向的内存块,该函数不检查源中是否有’\0’字符——它总是精确地复制num字节。但
2022-03-15 19:19:10
1505
原创 C语言 字符串函数
前言:字符串是一种重要的数据类型,但是C语言没有显式的字符串数据类型,字符串通过字符串常量或字符数组方式储存。C语言提供了许多与字符串相关函数,可以在头文件<string.h>中查看函数声明,本章将会自行编写相关字符串函数一、字符串长度函数 strlen功能:字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )库函数strlen函数声明:size_t strlen(char const *string
2022-03-14 00:40:46
12241
2
原创 C语言 数组
C语言 数组一、一维数组1.1 一维数组的声明1.2 一维数组的初始化1.3 引用数组元素数组:一组相同类型元素的集合一、一维数组1.1 一维数组的声明元素类型 数组名[数组大小]说明:数组大小一般为常量表达式,c99标准支持可变长数组,即大小可以使用变量表示int arr[10]; //声明一个整形数组,数组有10个元素,数组名为arr1.2 一维数组的初始化初始化:在数组声明时为数组赋值int arr1[5] = {1,2,3};int arr2[5] = {1,2,3,4,5};
2022-02-26 14:16:32
1677
原创 变量与static关键字
变量与static关键字修饰一、变量1.1 全局变量与局部变量1.2 变量的作用域1.3 变量的生命周期二、static关键字2.1 修饰全局变量2.2 修饰局部变量2.3 修饰函数一、变量变量:在内存中开辟一段空间,存储对应的值。这个空间存储的值是可以改变的变量声明:告诉编译器有个变量,编译器在内存中开辟一段空间,若没有赋值,则存储的值是一个随机值变量声明语法: 类型 变量名; 如 int i;即有个变量为i, i为int类型 1.1 全局变量与局部变量全局变量:定义在代码块 { }之外
2022-01-20 13:07:40
641
原创 C语言 初级指针讲解
指针一、指针是什么1.1 地址是什么1.2 指针与指针变量二、指针类型意义2.1 指针+-整数2.2 指针的解引用三、野指针3.1 野指针成因3.1.1 指针未初始化3.1.2 指针越界访问3.1.2 指针指向的空间已经释放3.2 避免野指针方法四、指针运算4.1 指针+-整数4.2 指针-指针4.3 指针的关系运算五、指针与数组5.1 数组名意义5.2 数组名两个例外一、指针是什么1.1 地址是什么 在计算机中,为了对内存空间进行管理,将内存空间划分成若干个存储单元。每个存储单元大小为1字节,并对每
2022-01-17 14:05:37
507
原创 C语言 运算符
运算符一、算数运算符二、移位运算符2.1左移运算符 <<2.2 右移运算符 >>三、位运算符3.1 按位与 &3.2 按位或 |3.3 按位异或 ^3.4 经典笔试题一、算数运算符算数运算符有: + - * / % 五种。由于运算符有两个操作数。也被称为双目运算符对于 / 运算符,两个操作数都是整数执行的是整数除法。至少有一个操作数是浮点时执行浮点除法#include <stdio.h>int main() { int i = 5
2022-01-15 12:25:45
1654
2
原创 C语言 函数
函数一、函数1.1 什么是函数1.2 C语言中函数分类二、函数定义与声明2.1函数的定义2.1函数的声明三、函数调用3.1实参与形参3.2传值调用与传址调用一、函数1.1 什么是函数函数:完成特定功能的程序段维基百科对函数的定义:子程序 1.在计算机科学中,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具有相对独立性。 2.一般会有输入参数并有返回值,提供了对实现过程的封装和细节的隐藏。1.2 C语言中函数分类函数主要分为两大类:
2022-01-10 16:24:58
318
原创 几个循环练习题(九九乘法表、金字塔、猜数字游戏)
前言在之前博客中讲解了循环的基础语法,下面通过几个小题来练习下。如之前没有学习过循环朋友可以先看下面这篇博客后再来看这篇。https://blog.youkuaiyun.com/kjl167/article/details/122376147先再来看此博客题目一、九九乘法表二、星号图案三、猜数字游戏一、九九乘法表分析:九九乘法表主要由两个变量相乘而成,变量范围为1-9,变量类型我们可以选择整数类型。1 * 1 = 1 (第1行,有1列)2 * 1 = 2 2 * 2 = 4 (第2行,有2
2022-01-09 16:06:35
2756
原创 C语言的控制结构(顺序结构、选择结构、循环结构)详解
C语言的三种控制结构一、顺序结构二、选择结构if语句switch语句三、循环结构for循环while循环do while循环前言:程序由三种基本结构组成:顺序结构、选择结构、和循环结构,任何程序都由这3种基本结构组合而成。优点:不会存在无规律的转向,可以使程序结构清晰,易于验证正确性且易于纠错。遵循这种方法的程序设计就是结构化程序设计。此处简单画出三种结构的执行流程图:一、顺序结构顺序结构:依照线性顺序依次执行,简单说就是从上到下依次执行例如下面程序会依次输出1、2、3、4、5#inclu
2022-01-08 10:18:23
42358
7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人