03 2022 档案
摘要:C++源文件从文本到需要四个过程: 预处理阶段 编译器把源文件包含的头文件、预编译语句(宏定义)进行分析替换,生成预编译文件(.i). 编译阶段 编译器进行语法分析、语义分析,语法检查无误后把代码翻译为汇编语言,将预编译文件(.i)转换为汇编代码,生成汇编文件(.s). 汇编阶段 把编译阶段生成的汇
阅读全文
摘要:目前,鉴于工作需求,为了提升自己的编码能力,与编码规范性。作者研究《Effective C++》一书,接下来将陆续做一些总结,与大家分享,供大家学习。 1.C++语言已经是个多重范型的编程语言,C++语言可被看作一个语言联邦,四个次语言是:1)C;2)Object-Oriented C++;3)Te
阅读全文
摘要:define 用define 定义的常量: 没有类型的不进行类型安全检查,可能会产生意想不到的错误,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define 所定义的宏变量在预处理阶段的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换; 用 define 可
阅读全文
摘要:谈到自由存储区与堆的区别,就需要了解new与malloc的区别。 实际上堆是C语言的关键术语,是操作系统所维护的一块特殊内存,它提供了动态分配的功能。用户使用malloc进行堆内存申请,使用free实现堆内存的释放。 但自由存储区不同,它是C++中的一个抽象的概念。C++中规定使用new/delet
阅读全文
摘要:栈和堆作为C++内存中的动态数据区,在程序执行过程中被动态的申请与释放,是C++内存管理中非常重要的环节。 在程序执行过程中,堆和栈有不同的分工,两者的区别为: 栈 堆 编译器自动申请与释放 用户手动申请与释放 连续存储结构,不会造成内存碎片 链式存储结构,容易造成内存碎片 编辑器自动处理,不会造成
阅读全文
摘要:C++是一门追求极致性能的语言,合理的内存管理能够缔造出极致性能的代码,否则,不合理的内存管理,会成为日常隐患,产生一系列的BUG。 Linux下操作系统程序地址空间的内存管理分布图如下所示: C++程序在执行时,内存区域主要可以分为四个部分:栈、堆、全局区(静态数据区)、代码段。 栈区: 由编译器
阅读全文
摘要:C++支持C语言的强制类型转换,并提供了四种应对各种的强制类型函数,以下对C++的强制类型转换做简单介绍。 1.C语言风格强制类型转换 1 TypenameB b; 2 TypenameA a=(TypenameA)b; C语言风格类型强制转换存在较多安全隐患,例如: 1)把一个指向 const 对
阅读全文
摘要:C++语言在编译的时候为了解决函数的多态问题,建立了与C语言编译器不同的函数名修饰规则,C++语言在编译的时候会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接阶段无法找到对应函数的情况。因此,C函数就需要用extern “C”进行链接指定,通知编译器以下函数或文件中函数
阅读全文
摘要: extern是外部声明关键字,字面意思就是声明某种变量或函数,在外部定义。 extern声明变量的两种方法 1.在其他文件中直接extern 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 extern int a
阅读全文
摘要: C++ 不定长输入,保存进数组,并打印 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 int main() { 6 vector<int> arr; 7 int i; 8 do { 9 cin >> i; 1
阅读全文
摘要:static作用 改变被修饰变量或函数的作用范围与生命周期。 全局变量 static修饰全局变量时,在同一文件中被修饰的全局变量和普通全局变量的作用范围与生命周期没有区别,但被修饰的全局变量只能在定义的文件中可见,其他文件无法访问该变量。 局部变量 static修饰函数中的局部变量时,该变量不会因为
阅读全文
摘要: std是一个命名空间,C++标准库中的标准函数与标准类都在std中定义,为了防止用户自定义函数或类与标准中命名冲突,使用标准库中需要限定命名空间。 标准库调用 1 #include<iostream> 命名空间限定 1 using namespace std;//或std:: C++非标准库中不
阅读全文
摘要: 函数功能把含有'\0'结束符的字符串复制到另一个地址空间。 函数声明:char *strcpy(char* dest, const char *src); 把以src为首地址NULL为结束符的数据复制到已dest开始的地址,但是,src与dest空间不能有重叠,且dest必须有足够的空间。 C+
阅读全文
摘要: 空指针 一个被赋值为0的指针,它不指向任何的对象或者函数。注意:指向内存编号为0的空间是空指针,当初始化指针变量,如果刚开始不知道指向那 就给他初始化指向0编号,但是空指针指向的内存是不可以访问(0到255之间是系统占用的内存用户不可以访问)。 空指针定义 1 int *p=nullptr;//
阅读全文
摘要:数组 指针 保存数据 保存数据地址 直接访问数据 间接访问,首先获得数据的地址,然后从该地址中获得数据 通常数据数据数目固定,且数据元素类型相同 用于动态的数据结构 隐式的分配和删除内存 手动分配和删除内存,关键词:new、delete 自身即为数据名 指向匿名数据或函数
阅读全文
摘要:引用是一个别名,指针是一个变量;变量中存储的数据是地址。 对指向地址变量进行操作时,引用不需要解引用;指针需要解引用(加*)。 引用定义时需要有明确指向,且指向一旦确定就不能改变;指针定义时指向可以为空,且中途指向可以改变。 ++运算意义不一样,引用名++:表示引用变量的值++;指针名++:表示指向
阅读全文
摘要:share_ptr指针涉及到循环引用问题会因为share_ptr指针对应的use_count()无法清0,导致内存泄露,直接上例子: 1 class S_B; 2 class S_A 3 { 4 public: 5 shared_ptr<S_B> m_b; 6 }; 7 8 class B 9 {
阅读全文
摘要: 在使用基本指针类型时,需要手动释放指针指向的内存,容易造成内存泄漏。而智能指针类型就是将基本指针类型封装成模板类,以便更好地管理内存。智能指针就是一个类,当超出类的作用域时,编译器会自动调用析构函数,自动释放资源,所以智能指针的作用原理就是函数结束时自动释放空间,无需手动释放内存空间。 智能指针
阅读全文