• C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器

十四、编程

(一)概念

  1. 系统函数及其库是 C++语言所必须的,预处理命令不是 C++语言的必须组成部分

  2. 优先级比较:静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法

  3. C++不是类型安全的,因为支持强制类型转换;类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域

  4. 浮点数算术标准是ieee754

  5. 程序的动态性越强,内存管理就越重要,内存分配程序的选择也就更重要

  6. C++真正正式公布的标准就三个:C++98、C++03、C++11

  7. /..../中可以嵌套//注释,但不能嵌套/..../注释

  8. Java和C++都是静态类型的面向对象编程语言

  9. 动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等

  10. 结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用 goto 语句

  11. C++的实体通常有三类:变量或对象;函数;类型(结构体类型等)

  12. 每个程序单位由三部分组成:预处理指令,全局声明,函数

  13. 时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度

    空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度

  14. 重入和不可重入:

这种情况出现在多任务系统当中,在任务执行期间捕捉到 信号 并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断 。如果从信号处理程序返回,则继续执行进程断点处的正常指令序列,从重新恢复到断点重新执行的过程中,函数所依赖的环境没有发生改变,就说这个函数是 可重入 的,反之就是 不可重入 的。

满足下面条件之一的多数是不可重入函数:

① 使用了静态数据结构;

② 调用了malloc或free;

③ 调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全局数据结构

④ 进行了浮点运算.许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现。

  1. C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv,并且还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组;

写成int main(int argc,char *argv[]),argc=arguments count表示参数个数,argv=argument vector表示数组指针,同时数组在参数传递时会转义为指针,即使[]中包含维度也会被忽略!所以char *argv[]等价于char argv,故也可以写成int main(int argc, char argv)

  1. 可以在类中或者名字空间中定义main函数,但是这个main函数与全局的main函数不是同一个函数,所以不是程序入口点。全局范围的main函数是程序的主函数,而且不能在全局范围内重载

  2. 其中C++98是第一个正式C++标准,C++03是在C++98上面进行了小幅度的修订,C++11则是一次全面的大进化( C++0x是C++11 标准成为正式标准之前的草案临时名字 )

  3. 面向对象程序设计优于传统的结构化程序设计,其优越性主要表现在,它有希望解决软

  4. 件工程的两个主要问题:软件复杂性控制和软件生产率的提高

  5. 面向对象系统的复用性是一种信息隐藏技术,目的在于将对象的使用者和设计者分开,使用者不必知道对象行为实现的细节,只需要设计者提供的协议命令对象去做即可

(二)面向对象的五大基本原则

  1. 单一职责原则(SRP)

  2. 开放封闭原则(OCP)

  3. 里氏替换原则(LSP)

  4. 依赖倒置原则(DIP)

  5. 接口隔离原则(ISP)

(三)作用域分有:

① 文件作用域

② 函数作用域

③ 块作用域

④ 类型声明作用域

⑤ 函数原型作用域

(四)深层复制和浅层复制

  1. 浅层复制:只复制指向对象的指针,而不复制引用对象本身

深层复制:复制引用对象本身,会拷贝动态分配的成员对象

如果是浅拷贝,修改一个对象可能会影响另外一个对象

如果是深拷贝,修改一个对象不会影响到另外一个对象

(五)软件测试和软件调试

① 软件测试:设计测试用例,发现软件中存在的错误

② 软件调试:诊断和改正程序中的错误,故程序调试的任务是诊断和改正程序中的错误

(六)内存分类

  1. BSS段:通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0

  2. 数据段:通常是指用来存放程序中已初始化的全局变量 的一块内存区域,static意味着在数据段中存放变量;

  3. 代码段:通常是指用来存放程序执行代码的一块内存区域;

  4. 堆:存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减,这一块在程序运行前就已经确定了;对于堆来讲,它的生长方向是向上的,是向着内存地址增加的方向增长。对于堆来讲,频繁的 new/delete 势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题

  5. 栈:栈又称堆栈,存放程序的局部变量(不包括static声明的变量)除此以外,在函数被调用时,栈用来传递参数和返回值。对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制对于栈来讲,生长方向是向下的,也就是向着内存地址减小的方向

  6. C++的内存分类:堆,栈,程序代码区,静态存储区,常量存储区

  7. C++没有规定每一种数据所占字节数 只规定了谁大谁小,故一般在16位机的C++系统中,short和int占两个字节,long占4个字节;在virtual c++中,短整型占两个字节,整型和长整型占4个字节

(七)编译器

  1. gcc 和 GCC 是两个不同的东西:

① GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。

② gcc是GCC中的GUN C Compiler(C 编译器)

③ g++是GCC中的GUN C++ Compiler(C++编译器)

④ 就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已

  1. gcc和g++的主要区别:

① 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)

② 对于 .c和.cpp文件,g++则统一当做cpp文件编译

③ 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL

④ gcc在编译C文件时,可使用的预定义宏是比较少的

⑤ gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏

  1. obj-c 的编译器处理后缀为 m 的文件时,可以识别 obj-c 和 c 的代码,处理 mm 文件可以识别 obj-c,c,c++ 代码,但 cpp 文件必须只能用 c/c++ 代码,而且 cpp 文件 include 的头文件中,也不能出现 obj-c 的代码,因为 cpp 只是 cpp

  2. c++的源程序是以. cpp作为后缀的

  3. 编译器把源程序翻译成二进制形式的“目标程序”,在windows系统中,目标程序以. obj作为后缀,在UNIX系统中,以. o作为后缀

  4. 从c++文件到生成exe文件经过预处理、编译、汇编和链接步骤

(八)容器

  1. 在C++中,容器是一种标准类模板

  2. C++11 STL中的容器:

① 顺序容器:

(1) vector:可变大小数组

(2) deque:双端队列

(3) list:双向链表

(4) forward_list:单向链表

(5) array:固定大小数组

(6) string:与vector相似的容器,但专门用于保存字符

② 关联容器:

(1) 按关键字有序保存元素:(底层实现为红黑树)

(2) map:关联数组;保存关键字-值对

(3) set:关键字即值,即只保存关键字的容器

(4) multimap:关键字可重复的map

(5) multiset:关键字可重复的set

③ 无序集合:

(1) unordered_map:用哈希函数组织的map

(2) unordered_set:用哈希函数组织的set

(3) unordered_multimap:哈希组织的map;关键字可以重复出现

(4) unordered_multiset:哈希组织的set;关键字可以重复出现

④ 其他项:

(1) stack、queue、valarray、bitset

  1. 构造异质链表的意义是用抽象类指针构造派生类对象链表(很多场景都要用链表来管理不同类型的对象/结点,这样的链表叫异质链表)

  2. List封装了链表,Vector封装了数组, list和vector得最主要的区别在于:vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]

  3. 关于STL各种容器和算法的sort和find函数对重载运算符的描述:

① 线性类型容器使用std::find会调用operator ==

② 线性类型容器sort会调用operator <

③ 二叉树类型的容器的sort和find都会调用operator <

④ 二叉树类型的容器进行std::sort和std::find时,都会调用operator < 。

⑤ 线性类型(vector、list)容器进行std::sort算法时,会调用operator <;进行std::find时,会调用operator ==。

  1. 根据它们具体的数据结构类型特点,都是可以非常好理解的。前者链式查找和排序,后者顺序查找和排序

  2. STL中的vector在增加成员时可能会引起原有成员的存储位置发生改变,因为vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量导致存储位置改变

  3. 迭代器支持的操作符:

① 比较两个迭代器的相等和不相等运算符(==和!=)

② 用于推进迭代器的后置和前置递增运算(++)

③ 用于读取元素的接应用运算符(*),解引用只会出现在赋值运算符右侧(即不可修改,只可读)

④ 箭头运算符(->)

⑤ 迭代器支持“+=”操作符的有deque,vector

⑥ 迭代器没有重载左移,右移运算符

(九)程序加载和运行

  1. 加载时地址就是程序放置的地址,运行地址就是程序定位的绝对地址,也即在编译连接时定位的地址。如果程序是在flash里运行,则运行地址和加载地址是相同的。如果程序是在ram里运行,但程序是存储在flash里,则运行地址指向ram,而加载地址是指向flash

  2. 运行时地址和加载地址不一定相同;运行时地址和加载地址时程序链接时决定的

(十)文件后缀

  1. 程序文件名的后缀是.cpp,经过编译后是.obj,经过连接后是.exe

① xx.h文件中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。

② xx.cpp文件一般放的是变量、数组、函数的具体定义。

  1. 程序实现经过:

① 头文件的预编译,预处理。

编译器在编译源代码时,会先编译头文件,保证每个头文件只被编译一次。

在预处理阶段,编译器将c文件中引用的头文件中的内容全部写到c文件中。

② 词法和语法分析(查错)。

③ 编译(汇编代码,.obj文件)。

转化为汇编码,这种文件称为目标文件。后缀为.obj。

④ 链接(二进制机器码,.exe文件)。

将汇编代码转换为机器码,生成可执行文件

(十一)数据流图

  1. 数据流程图包括:

① 指明数据存在的数据符号,这些数据符号也可指明该数据所使用的媒体

② 指明对数据执行的处理的处理符号,这些符号也可指明该处理所用到的机器功能

③ 指明几个处理和(或)数据媒体之间的数据流的流线符号

④ 便于读、写数据流程图的特殊符号

例:

(十二)不同字节计算机各数据类型字节大小

C++篇:第十四章_编程_知识点大全的更多相关文章

  1. 《Thinking in Java》十四章类型信息_习题解

    1~10    Page 318 练习1. 在ToyTest.java中,将Toy的默认构造器注释掉,并解释发生的现象. 书中代码如下(略有改动): package org.cc.foo_008; p ...

  2. java 面向对象编程--第十四章 多线程编程

    1.  多任务处理有两种类型:基于进程和基于线程. 2.  进程是指一种“自包容”的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存. 3.  线程是进程内部单一的 ...

  3. 20190827 On Java8 第十四章 流式编程

    第十四章 流式编程 流的一个核心好处是,它使得程序更加短小并且更易理解.当 Lambda 表达式和方法引用(method references)和流一起使用的时候会让人感觉自成一体.流使得 Java ...

  4. 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记

    第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...

  5. 《OpenCL异构并行编程实战》第十二至十四章

    ▶ 第十二章,在其他语言中使用 OpenCL ● JOCL(Java Building for OpenCL),PyOpenCL ● 一个 PyOpenCL 的例子代码,需要 pyopencl 包 i ...

  6. 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)

    由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...

  7. 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)

    本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...

  8. 进击的Python【第十四章】:Web前端基础之Javascript

    进击的Python[第十四章]:Web前端基础之Javascript 一.javascript是什么 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编 ...

  9. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  10. perl 第十四章 Perl5的包和模块

    第十四章 Perl5的包和模块 by flamephoenix 一.require函数  1.require函数和子程序库  2.用require指定Perl版本二.包  1.包的定义  2.在包间切 ...

随机推荐

  1. 常见的企业Wiki

    企业Wiki(Enterprise Wiki)指适用于企业或组织内部使用的Wiki.与非企业Wiki(如著名的MediaWiki)最根本的不同点在于,企业Wiki是为企业量身定做的Wiki.通过鼓励. ...

  2. 快速掌握keepalived

    转载请注明出处: Keepalived是一个基于VRRP(虚拟路由冗余协议)的开源软件,用于在Linux系统上实现高可用性和负载均衡.它的主要功能是通过多台服务器之间的协作,确保在其中一台服务器发生故 ...

  3. Git小白入坑总结(部分)

    本地仓库的创建和初始化 git操作远程仓库 git clone git pull git push 对Git连接GitHub过程的理解 本地仓库的创建和初始化 直接在对应文件夹下用git init可以 ...

  4. Splay 详细图解 & 轻量级代码实现

    学 LCT 发现有点记不得 Splay 怎么写,又实在不知道这篇博客当时写了些什么东西(分段粘代码?),决定推倒重写. 好像高一学弟也在学平衡树,但相信大家都比樱雪喵强,都能一遍学会!/kel 写在前 ...

  5. [Python]常用知识

    Python 常用知识 编译型语言 和 解释性语言 解释性语言 编译型语言 概念 计算机不能直接的理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言的编写的 ...

  6. CatCatCat

    拿到题目没有思路,查看了题解 附件 放到kali中用string找flag,得到一个密钥,可以用来下面的解密 打开我养了-- 发现里面以U2F开头,结合txt名称"我养了一只叫兔子的91岁的 ...

  7. c#中命令模式详解

    基本介绍:   命令模式,顾名思义就是将命令抽象化,然后将请求者和接收者通过命令进行绑定.   而命令的请求者只管下达命令,命令的接收者只管执行命令.   从而实现了解耦,请求者和接受者二者相对独立. ...

  8. Mysql数据库查询之模糊查询

    一.什么是模糊查询模糊查询是根据一定的模式匹配规则,查找与指定条件相似或相符的数据.二.模糊查询实操通配符查询1.% 表示任意0个或多个字符形式一: select 查询字段 from 表名 where ...

  9. Docker安装与教程-Centos7(一)

    复现漏洞时,经常要复现环境,VMware还原太过麻烦,所以学习docker的基本操作也是必要的 Docker三要素-镜像.容器.仓库 操作系统:Centos7 官方教程文档 1.Docker的安装与卸 ...

  10. 【教程】cpp转python Nanobind 实践 加速轻量版 pythonbind11

    主要是尝试一下把c++这边的函数封装打包给python用,选择nanobind的原因是:1. 优化速度快,2. 生成二进制包小,不过pythonbind11是更为广泛知道的,nanobind也是pyt ...