C++基础知识汇总

1. C++语言基础
1.1 变量
声明与定义
变量定义:用于为变量分配存储空间,还可为变量指定初始值。变量声明:用于向程序表明变量的类型和名字。对变量来说,除非有extern关键字,否则都是变量的定义。在一个程序中,变量只能定义一次,却可以声明多次。
函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。

如果局部变量和全局变量重名,局部变量会屏蔽全局变量。要使用全局变量,要在变量名前添加“::”。

extern关键字
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
extern “C”表示接下来的内容按C的规则进行编译。比如C++编译器通过修改所有函数的名字实现函数重载机制,C则是按函数原本的名字进行编译的。

全局变量和局部变量的存储方式
全局变量储存在静态数据库,局部变量在堆栈。全局变量在程序开始执行时分配存储区,程序执行完毕释放,在程序执行过程中全局变量始终占据固定的存储单元;局部变量是动态分配存储空间的,在调用变量所在函数时,系统会给函数的局部变量分配存储空间,在函数调用结束时就自动释放这些存储空间。

一个正数的补码与其原码的形式相同,一个负数的补码是将该数绝对值的二进制按位取反再加1.

八进制整常数必须以0开头,数码取值为0~7;十六进制整常数是以0x开头的,其数码取值为0~9,a~f;十进制整常数无前缀。

转义字符是特殊的字符常量,“\”后面接一个或几个字符,整体表示一个转义字符,例如“\n”是一个字符,表示回车。

数据类型在运算过程中的转换规则
在整型、实型和字符型数据间进行混合运算时,应从低精度向高精度转换,即将字符型数据先转换成整型,再将整型数据和实型数据转换成双精度类型数据,然后在同类型数据间进行运算。

无符号类型只能存放不带符号的整数,不能存放负数,当为其赋值为负数时会自动转换为无符号类型数值。

逗号运算符:先计算左边的操作数,再计算右边的操作数,右边操作数的类型和值作为整个表达式的结果。

左值与右值
在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),一般指表达式结束后依然存在的持久对象。
右值指的则是只能出现在等号右边的变量(或表达式)。一般指表达式结束就不再存在的临时对象。
对于基础类型,右值是不可被修改的,也不可被 const, volatile 所修饰;但对于C++中自定义的类型(user-defined types),右值却允许通过它的成员函数进行修改。

死循环
当程序要求反复执行,然后等待中断或外界的变量的发生。如操作系统、WIN32 程序、嵌入式系统软件、多线程程序的线程处理函数等这些都用到死循环。

1.2 static、const和sizeof
static关键字
(1)全局静态变量
在全局变量前加上关键字 static, 全局变量就定义成一个全局静态变量.
存储在静态存储区, 在整个程序运行期间一直存在。
全局静态变量在声明他的文件之外是不可见的,可以被模块内所有函数访问,但不能被模块外其他函数访问。C/C++,Linux最全资料地址https://docs.qq.com/doc/DWHhNTlVtaFJId0ht
(2)局部静态变量
在局部变量之前加上关键字 static, 局部变量就成为一个局部静态变量。
存储在静态存储区
作用域仍为局部作用域, 当定义它的函数或者语句块结束的时候, 作用域结束。 但是当局部静态变量离开作用域后, 并没有销毁, 而是仍然驻留在内存当中, 只不过我们不能再对它进行访问, 直到该函数再次被调用, 并且值不变;
(3) 静态函数
在函数返回类型前加 static, 函数就定义为静态函数。
函数的定义和声明在默认情况下都是 extern 的, 但静态函数只是在声明他的文件当中可见, 不能被其他文件所用。函数的实现使用 static 修饰, 那么这个函数只可在本 cpp 内使用, 不会同其他 cpp 中的同名函数引起冲突;
(4)类的静态成员
静态成员是类的所有对象中共享的成员, 而不是某个对象的成员。 对多个对象来说, 静态数据成员只存储一处, 供所有对象共用
(5)类的静态函数
在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this指针,因而只能访问类的 static 成员变量。

全局变量、静态全局变量、静态局部变量、局部变量的区别
存储区域:全局变量、静态全局变量、静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
作用域:全局变量在整个工程文件内都有效,其他的源文件也能访问;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,函数返回后失效。

const关键字
(1)对变量来说
const 修饰的是只读变量,只读变量的值在定义后就不能再改变了,而且必须进行初始化。
(2)对指针来说
可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
const指针不能指向别的地址,但是可以修改其所指对象的内容,指向const对象的指针,所指内容不能改变,但可以指向别的地址。const对象的地址只能赋给const对象的指针。
(3)在一个函数声明中
const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数
若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;可以指定成员函数的返回值为 const 类型,以使得其返回值不为"左值",返回值也要相应地赋给一个常量或者常量指针。

const 与#define 相比有何优点
(1)const 修饰的只读变量具有特定的类型,而宏没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
(2)有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
(3)在C++中,编译器通常不为普通 const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高,而在C中,const总是占用内存。在C++中只是用const常量而不使用宏常量,即const常量完全取代宏常量。学习资料推荐https://docs.qq.com/doc/DWHhNTlVtaFJId0ht

sizeof关键字
sizeof 表示的是计算对象所占内存空间的大小,实际上它只是关键字并非函数。sizeof 在计算变量所占空间大小时,括号是可以省略的,而在计算类型大小时括号则不能省略。

sizeof 与 strlen的区别
(1)sizeof是运算符,strlen是函数;
(2)sizeof可以用类型、函数作为参数,strlen只能用char*作为参数;
(3)数组做sizeof的参数不退化,传递给strlen就退化为指针;
(4)strlen用于计算字符串的长度,而不是所占内存大小。内部实现是用一个循环计算字符串的长度,直到“\0”为止(不包括\0)。
(5)sizeof操作符的结果类型是size_t,以保证能够容纳最大对象的字节大小。

1.3 函数
传值的过程:
(1)行参与实参各占一个独立的存储空间。
(2)行参的存储空间是函数被调用时才分配的。调用开始,系统为行参开辟一个临时存储区,然后将各实参之值传递给行参,这时行参就得到了实参的值。
(3)函数返回时,临时存储区也被撤销。
传值的特点:单向传递,即函数中对行参变量的操作不会影响到调用函数中的实参变量。

传引用参数:传递的是参数的地址,所以调用后参数的值会改变。

extern “C”
C++语言支持函数重载,C 语言不支持函数重载。函数被 C++编译后在库中的名字与 C 语言的不同。C++提供了 C 连接交换指定符号 extern“C”来解决名字匹配问题。

** C 语言是怎么进行函数调用**
每一个函数调用都会分配函数栈, 在栈内进行函数执行过程。 调用前, 先把返回地址压栈, 然后把当前函数的 esp 指针压栈。参数压栈顺序是从右到左。

C++如何处理返回值:生成一个临时变量, 把它的引用作为函数参数传入函数内。

1.4 指针和引用
指针和引用的区别
(1)指针用于指向对象的地址,有自己的一块空间, 而引用只是一个别名,与对应的变量代表同一变量单元࿱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值