
C++专栏
文章平均质量分 78
此专栏专门为C++开设,专栏不仅收录了C++相关知识点,而且在相关知识点中积累了学习过程中相关习题,对初学C++的人有很大帮助哦!
小米内推官_AngelDg
我们总以为,是生活欠我们一个“满意”,其实是我们欠生活一个“努力”。
展开
-
#define 宏的边际效应是什么
在C语言和C++中,#define宏进行的字符替换,要注意边际效应:举例一:#define N 2+3我们预想的N值是5,我们这样使用N,int a = N/2;我们预想的a的值是2.5,可实际上a的值是3.5(这样说不太恰当,因为是取整,但为了说明先这样理解)原因在于在预处理阶段,编译器将 a = N/2处理成了 a = 2+3/2;这就是宏定义的字符串替换的“边缘效应”,因此要如下定义:#define N (2+3)举例二:#define MIN(a, b) a > b ? b原创 2021-09-06 20:32:10 · 750 阅读 · 0 评论 -
C++11:constexer 的用法详解
文章目录引入constexpr初探引入C++11为了提高代码执行效率做了一些改善。这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力。假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单。constexpr使我们很容易利用上编译时编程的优势。常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。这是很大的优化:假如有些事情可以在编译时做,它将只做一次,而不是每次程序运行时。需要计算一个编译时已知的常量,比如特定值的sine或cosin?确实你亦可以使原创 2021-08-04 14:02:53 · 319 阅读 · 0 评论 -
关于C/C++前置++与后置++的区别与习题
本题相信大多数人都是对D选项有疑惑:D选项,函数的参数是从右向左压栈的,输出时从栈顶开始,相当于: int i = 3; ++i; ++i; printf("%d,%d",i,i);所以是 5,5;再举一个例子,int i = 1; printf("%d,%d", i += 2, i *= 3); 在输出i之前先进行了i *= 3和 i += 2;最终i = 5;所以结果是5,5;下面是...原创 2019-11-25 18:11:27 · 1037 阅读 · 0 评论 -
C / C++:const 关键字的作用
文章目录C与C++中 const 关键字有什么区别使用 const 提高函数的健壮性用 const 修饰函数的参数用 const 修饰函数的返回值C与C++中 const 关键字有什么区别C语言中const的用法:const修饰的变量是只读的,本质还是变量。const修饰的局部变量在栈分配空间,这里举一个例子:#include <stdio.h>#include <stdlib.h>int main() { const int c = 0; int *p =原创 2021-03-11 15:29:09 · 512 阅读 · 0 评论 -
数组和指针的对比
C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变;数组实际上就是一个常量指针,例如: char ar[10]; 就相当于char * const ar; 即数组名对应一块空间, 该数组名不能指向其他空间。 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险原创 2021-03-09 21:51:11 · 440 阅读 · 5 评论 -
C++:如何解决迭代器失效问题
文章目录insert 导致的迭代器失效erase 导致的迭代器失效vector总结:insert和eraser操作会使迭代器失效。insert 导致的迭代器失效insert操作在vector中会炸,而在list中不会。 比如下面这个代码运行会直接炸int main() { vector<int> s{ 1,2,3,4,5,6,7,8 }; for (auto i = s.begin(); i != s.end(); ++i) { if (*i原创 2021-01-07 17:21:37 · 508 阅读 · 1 评论 -
#pragma once 与 #ifndef 相关知识点
提问为什么要在头文件前加上 #pragma once 或者 #ifndef ?为了避免同一个文件被include多次同一个文件被 include 多次的危害:防止重复定义的错误如果这个头文件变化,那么所有include这个文件的源文件都需要重新编译,即使没有去使用里面的任何内容避免措施:头文件加#pragma once... ... // 一些声明语句头文件加#ifndef __SOMEFILE_H__ // 宏名 #define __SOMEFILE_H__原创 2020-12-29 21:44:57 · 140 阅读 · 0 评论 -
malloc 的实现原理
文章目录结论具体内容内存分配的原理具体分配过程提问摘要:由于面试题会问到 malloc 的底层原理,今天就来记录一下,毕竟学习要“知其所以然”,这样才会胸有成竹。注:下面分析均是基于 linux 环境下的 malloc 实现。Linux 的虚拟内存管理有几个关键概念:每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址;虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址;如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,原创 2020-12-28 00:06:14 · 5159 阅读 · 3 评论 -
了解常用的C/C++函数调用约定
函数调用约定什么是函数调用约定?约束事件编辑什么是函数调用约定?调用约定(Calling convention)决定以下内容:函数参数的压栈顺序由调用者还是被调用者把参数弹出栈产生函数修饰名的方法。关于 C/C++ 函数调用约定,大多数时候并不会影响程序逻辑,但遇到跨语言编程时,了解一下还是有好处的。 VC 中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,为了跟 Windows API 保持一致,建议使用 __st原创 2020-12-15 18:59:31 · 225 阅读 · 0 评论 -
递归与循环的区别(P:尾递归优化)
递归与循环递归算法循环算法尾递归尾递归的概念函数栈的作用尾递归为什么可以优化递归算法递归就是函数体中调用自己,如果不加控制,将无休止的调用自己,直到堆栈溢出。优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)缺点:它的运行需要较多次数的函数调用(消耗空间和时间),每次函数调用,都需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。递归算法的运行效率较低。在递归调用的过程中系统为每一层的返回点、局部变量等开辟了栈来储存。递归次数过原创 2020-12-15 13:10:48 · 881 阅读 · 0 评论 -
空指针、野指针、通用指针、垂悬指针
题目:空指针是指()A.所指向的空间位置是未存放任何数据的指针.B.所指向的空间位置存放着数据0的指针.C.所指向的空间位置可用于存放任何类型数据的指针.D.所指向的空间位置就是地址0的指针.答案: D解析如下:空指针即p=NULL,NULL就代表系统的0地址单元....原创 2020-02-20 20:48:24 · 483 阅读 · 0 评论 -
C/C++:运算符的详解及其运算优先级
C 运算符运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言拥有丰富的运算符,并提供了以下类型的运算符:算术运算符位运算符逻辑运算符关系运算符赋值运算符其他运算符本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。算术运算符下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:...原创 2019-09-07 14:19:52 · 728 阅读 · 0 评论 -
C++:布尔类型(bool)详细分析
C++概述20世纪80年代,AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事在C语言的基础上成功开发出C++语言。C++语言是一种混合型语言,它保留了C语言所有的优点,同时又增添了面向对象的编程机制,我们可以将C++语言视为C语言的改进和扩展。基于C语言开发的C++语言兼容C语言,因此用C语言编写的程序基本上可以不做改动地用于C++。相对于C语言,C++...原创 2019-09-10 16:45:44 · 28656 阅读 · 3 评论 -
面试题之GetMemory关于内存的详解
题目一:void GetMemory(char *p){ p = (char *)malloc(100);}void Test(void){ char *str = NULL; GetMemory(str);//目的是通过此函数给str空间 strcpy(str, "hello world"); printf(str);}出现问题:在函数内部修...原创 2019-11-12 14:34:22 · 801 阅读 · 0 评论 -
详解sizeof与strlen的区别~~
区别:一、定义不同sizeof是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。2、它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:数组——编译时分配的数组空间大小;指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4...原创 2019-11-25 11:35:47 · 1648 阅读 · 0 评论 -
printf,sprintf,fprintf的区别和用法
三个函数的目的一致,即输出格式化的文本内容至屏幕。一、输出目标不同printf,是把格式化字符串输出到标准输出,即标准输出文件,对应终端的屏幕。sprintf,是把格式化字符串输出到指定字符串,也可作为缓冲区,而printf只能输出到命令行上。fprintf,是把格式化字符串输出到指定文件中。二、函数原型不同printf函数原型 int printf ( const...原创 2019-11-26 17:19:07 · 371 阅读 · 0 评论 -
C/C++:struct 与 typedef struct的使用区别
1.首先:注意在C和C++里不同在C中定义一个结构体类型要用typedeftypedef struct Student{ int a;}Stu;于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)这里的Stu实际上就是struct Student的别名。Stu==struct Student另外这里也可以不写S...原创 2019-12-05 01:50:05 · 251 阅读 · 0 评论 -
C/C++:assert()断言的用法
assert宏的原型定义在<assert.h>中作用:如果它的条件返回错误,则终止程序执行。原型定义:#include <assert.h>void assert( int expression );assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运...原创 2020-01-18 14:22:36 · 850 阅读 · 0 评论 -
C/C++:#define 与 typedef、const 的使用区别
#define的用法#define为一宏定义语句,通常用它来定义常量,以及用它来实现宏。它本身并不在编译过程进行,而是在这之前的预处理过程中已经完成了,但也因此难以发现潜在的错误以及其他代码维护问题。typedef的用法typdef常用来定义一个标识符以及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间。在刷笔试题的时候有问到这个:test.c文件中包括如下语句:#de...原创 2020-01-26 15:30:59 · 404 阅读 · 0 评论 -
[每日一题]:3.替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。代码如下:class Solution {public: void replaceSpace(char *str, int length) { // 计算空格的个数 int space_num = 0; for (i...原创 2020-01-27 23:46:39 · 204 阅读 · 0 评论 -
详解 CPU 大段存储与小端存储
计算机界的大小端问题有著名的CPU两大派系,PowerPC系列采用大端(big endian)的方式存储数据,而X86系列则采用小端(little endian)方式存储数据。很显然如果你的程序只运行在PowerPC系列的CPU上,你完全可以不管什么是little endian,但是如果你PowerPC上的程序要和X86上的程序打交道,那么你就必须进行转换才能相互识别,我们又该怎样去理解它呢?...原创 2020-02-20 11:37:46 · 1766 阅读 · 0 评论 -
内存分配方式(堆、栈 / 栈帧、自由存储区、全局/静态存储区和常量存储区)
程序的内存分配:一个由C/C++编译的程序占用的内存分为以下几个部分:栈区(stack): 由编译器自动分配释放,存放函数的参数值,局部变量的值等。栈的生长方向是从高往低的(向着内存地址减小的方向),其操作方式类似于数据结构中的栈。堆区(heap) : 堆区的生长方向是向上增长的(向着内存地址增加的方向),用于分配程序员申请的内存空间(比如new 申请的动态内存),一般由程序员分配释放,若...原创 2020-02-20 18:17:29 · 1785 阅读 · 1 评论 -
[每日一题]11:了解并实现恺撒密码加密解密(C++)
文章目录凯撒算法 概述举例:图解凯撒加密代码如下:凯撒算法 概述在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。凯撒密码是罗马扩张时期朱利斯• 凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被...原创 2020-03-06 16:41:57 · 3874 阅读 · 0 评论 -
迈入C++的大门啦!
什么是C++C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。oop语言三大特性:封装,继承,多态(C++语言是一个部分面向对象的语言)1982年,B...原创 2020-03-06 19:32:45 · 432 阅读 · 0 评论 -
C++知识点博文汇总
C++系列该文章收录在学习C++过程中的大大小小知识点。目的是在学习后再次梳理各知识点的基础知识,为掌握C++重难点打基础,同时也会第一手的复习资料。学习C++路途漫长,知识点繁多,及时的总结、梳理知识点是相当有必要。将文章做成表格链接,也有助于自己梳理知识点,方便自己查询。C++系列博客文章链接:C++知识点0.C++初识...原创 2020-03-06 20:10:12 · 806 阅读 · 0 评论 -
C++关键字、命名空间、输入&输出
文章目录C++关键字名字空间(namespace)C++输入&输出C++关键字ISO C++98/03关键字共63个,此处严格按标准原文排版:名字空间(namespace)命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,...原创 2020-03-06 20:53:11 · 1729 阅读 · 3 评论 -
C++:缺省参数,内联函数(inline),宏的优缺点
文章目录缺省参数:缺省参数概念缺省参数分类总结:缺省参数:缺省参数概念缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。void TestFunc(int a = 0){ cout<<a<<endl;}int main() { TestFunc(); // 没有传参时,使用参数的默...原创 2020-03-07 09:19:15 · 704 阅读 · 0 评论 -
C++:函数重载的使用细则
文章目录函数重载函数重载概念名字修饰(name Mangling)总结:C++中函数重载底层是怎么处理的?重载函数的调用匹配编译器是如何解析重载函数调用的?extern “C”函数重载自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后...原创 2020-03-07 17:25:26 · 664 阅读 · 0 评论 -
C++:引用的使用细则
文章目录引用概念引用特性例题:注意:传值、传引用效率比较引用和指针的区别引用和指针的不同点:总结:引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。类型& 引用变量名(对象名) = 引用实体;void TestRef(){ int a = 10; int& ra = a;//<=...原创 2020-03-07 22:26:17 · 292 阅读 · 0 评论 -
[每日一题]12:字符串压缩
题目描述:对字符串进行RLE压缩,将相邻的相同字符,用计数值和字符值来代替。例如:aaabccccccddeee,则可用3a1b6c2d3e来代替。输入描述:输入为a-z,A-Z的字符串,且字符串不为空,如aaabccccccddeee输出描述:压缩后的字符串,如3a1b6c2d3e...原创 2020-03-07 23:01:39 · 382 阅读 · 0 评论 -
[每日一题]13:删除字符串首尾空格,中间的连续空格只留一个
题目描述:删除字符串首尾空格,中间的连续空格只留一个,原来字符串的顺序不变。输入描述:“***** as**** adap******”(*表示空格)输出描述:“as*adadp”...原创 2020-03-08 14:26:26 · 652 阅读 · 0 评论 -
C++:auto关键字(C++11)、基于范围的for循环(C++11)
auto简介在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它。这是因为在C语言中使用auto关键字声明一个变量为自动变量,是C语言中应用最广泛的一种类型,在函数内定义变量时,如果没有被声明为其他类型的变量都是自动变量,也就是说,省去类型说明符auto的都是自动变量。这里的其他类型指的是变量的存储类型即:静态类型变量(stat...原创 2020-03-08 18:21:53 · 2637 阅读 · 0 评论 -
C++:指针空值nullptr(C++11)
文章目录C++98中的指针空值nullptr 与 nullptr_t总结C++98中的指针空值在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:void TestPtr(){ int* p1 = NULL; int* p2 = 0;...原创 2020-03-08 19:08:00 · 433 阅读 · 0 评论 -
C++:类和对象的入门(class、struct、(空)类的大小)
类的引入C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。struct Student{ char _name[20]; char _gender[3]; int...原创 2020-03-08 21:06:35 · 400 阅读 · 0 评论 -
C++:this指针是什么?
文章目录指针的引出this指针是什么?this指针的六大属性:总结:指针的引出#include <iostream>using namespace std;//定义一个日期类Dateclass Date{public : void Display () { cout <<_year<< "-" <<_...原创 2020-03-08 22:06:27 · 503 阅读 · 0 评论 -
[每日一题]14:用54张不同的扑克牌构成牌堆,发给3个玩家。
题目声明一个扑克牌类,拥有方法:传入花色和点数生成扑克牌、打印扑克牌。声明一个玩家类,每人拥有18张扑克牌。拥有方法:增加手牌(摸牌)、展示手牌。用54张不同的扑克牌构成牌堆,发给3个玩家。手牌要求降序排序展示注意发牌的时候,牌不能重复派发(需要将派发过的牌置为无效牌)代码如下:#include <iostream>#include <cstring&g...原创 2020-03-10 23:00:41 · 2770 阅读 · 0 评论 -
C++:类中构造函数的由来
文章目录类的6个默认成员函数构造函数特性要点总结:类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。构造函数class Date{ public: void SetDate(int year, int month, int day) { _year...原创 2020-03-11 15:53:45 · 455 阅读 · 0 评论 -
C++:类的六个默认函数之一 —— 析构函数
文章目录析构函数概念析构函数特性要点总结:析构函数概念前面通过构造函数的学习,我们知道一个对象时怎么来的,那一个对象又是怎么没呢的?与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。析构函数特性析构函数是特殊的成员函数。其特征如下:析构函数名是在类名前加上字符 ~。无参数无返回值。一个...原创 2020-03-11 17:33:53 · 7441 阅读 · 3 评论 -
C++:类的六个默认函数之一 —— 拷贝构造函数
文章目录拷贝构造函数概念拷贝构造函数特征以传值方式传参数:要点总结:拷贝构造函数概念那在创建对象时,可否创建一个与一个对象一某一样的新对象呢?拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。拷贝构造函数特征拷贝构造函数也是特殊的成员函数,其特征如下:拷贝构造函数是构造函数的一个重载形式。拷贝构...原创 2020-03-11 18:14:30 · 2471 阅读 · 0 评论 -
C++:类的六个默认函数之一 —— 赋值重载
文章目录运算符重载概念赋值运算符重载要点总结运算符重载概念C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)注意:不能通过连接其他符号来创建新的操作符:比...原创 2020-03-12 18:34:53 · 2505 阅读 · 0 评论