C++查漏补缺复习

目录

  • C++
    • 变量
      • 数据类型
      • 浮点型
      • 字符常量
      • 强制类型转换
      • 静态变量
      • 自动变量
      • register变量(寄存器变量)
    • 运算符优先级
      • 面向对象
      • 默认函数
      • 运算符重载
      • 友元函数
      • 拷贝构造函数
      • 虚函数
      • 函数重载
      • 内联函数
    • 模板
    • 函数
      • printf函数
      • malloc() C
      • #import
    • 其他
      • * SEH

C++

变量

数据类型

基本数据类型的等级从低到高如下:char int long float double运算的时候是从低转到高的,表达式的类型会自动提升为参与表达式求值的最上级类

浮点型

无论是float 还是double,在内存中的存储分为三部分:符号位,指数位,尾数位;位运算符对它们没有意义

字符常量

https://baike.baidu.com/item/字符常数/20922763?fromtitle=字符常量&fromid=103245&fr=aladdin

强制类型转换

http://c.biancheng.net/view/2343.html
C++ 对类型转换进行了分类,并新增了四个关键字。

xxx_cast(data)
dynamic_cast 只能转换指针类型和引用类型

静态变量

https://www.runoob.com/w3cnote/cpp-static-usage.html
目的是将函数中此变量的值保存至下一次调用。
全局(静态)存储区
DATA 段(全局初始化区)存放初始化的全局变量和静态变量;
BSS 段(全局未初始化区)存放未初始化的全局变量和静态变量。
在 C++ 中 static 的内部实现机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
不能在类的声明中定义,也不能在头文件中类声明的外部定义。
静态变量存储在程序的静态存储区而非栈上空间。
static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以;static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化,如果没有显式初始化,会被程序自动初始化为0。
它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
类的非静态成员函数可以调用用静态成员函数,但反之不能。
类的静态成员变量必须先初始化再使用。
静态成员函数没有 this 指针。

自动变量

普通的变量,不管是否声明为auto,都是自动型变量。
也可以显式声明为auto变量。

register变量(寄存器变量)

register变量:它是把变量存储在cpu中的寄存器中,当一个变量需要反复读写时,不需要反复的访问内存,而直接可以使用它,并且,register是一个建议型的关键字,编译器可能会因为变量不满足一定条件而放弃使用寄存器变量。一般情况下将局部自动变量和函数形参作为寄存器变量。
所以当定义一个静态变量为寄存器变量,编译器不会通过,它仍然还是静态变量。

运算符优先级

三元运算符[?:] 从右至左

面向对象

面向对象的基本特征:封装、继承、多态

默认函数

如果只是声明一个空类,不做任何事情的话,编译器会自动生成
一个默认构造函数
一个拷贝默认构造函数
一个默认拷贝赋值操作符
一个默认析构函数
这些函数只有在第一次被调用时,才会别编译器创建。所有这些函数都是inline和public的。

运算符重载

https://www.runoob.com/cplusplus/cpp-overloading.html
重载决策说明了是编译器自动选择重载函数的。
函数重载同名函数参数必须不一样。
运算符重载如果不在类内声明,需要将运算的所有参数都放在参数列表中,如果在类内声明,则一个参数可以直接用this指代自己的属性。
只能用成员函数重载的运算符 =,[],(),->
不可重载的运算符 . | .* ,->* | :: | sizeof | ?: |#

友元函数

https://www.runoob.com/cplusplus/cpp-friend-functions.html
友元函数可以访问包括类内private的等所有成员。
友元函数定义 在类内声明 添加friend
友元函数不需要添加类的作用域

拷贝构造函数

拷贝构造函数与构造函数名称一,如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。

拷贝构造函数会在以下情况下调用
1.一个对象以值传递的方式传入函数体。
2.一个对象以值传递的方式通过函数返回。
3.一个对象要通过另一个对象就行初始化。

虚函数

https://blog.csdn.net/weixin_43329614/article/details/89103574

https://blog.csdn.net/weixin_43919932/article/details/104157463

什么样的函数不能声明为虚函数?

  1. 不能被继承的函数。
  2. 不能被重写的函数。
    1)普通函数
    普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。
    而多态体现在运行时绑定。通常通过基类指针指向子类对象实现多态。
    2)友元函数
    友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。
    3)构造函数
    首先说下什么是构造函数,构造函数是用来初始化对象的。假如子类可以继承基类构造函数,那么子类对象的构造将使用基类的构造函数,而基类构造函数并不知道子类的有什么成员,显然是不符合语义的。从另外一个角度来讲,多态是通过基类指针指向子类对象来实现多态的,在对象构造之前并没有对象产生,因此无法使用多态特性,这是矛盾的。因此构造函数不允许继承。
    4)内联成员函数
    我们需要知道内联函数就是为了在代码中直接展开,减少函数调用花费的代价。也就是说内联函数是在编译时展开的。而虚函数是为了实现多态,是在运行时绑定的。因此显然内联函数和多态的特性相违背。
    5)静态成员函数
    首先静态成员函数理论是可继承的。但是静态成员函数是编译时确定的,无法动态绑定,不支持多态,因此不能被重写,也就不能被声明为虚函数。

函数重载

不能把返回值作为函数重载的条件,原因是编译器在编译时不会去判断函数的返回类型,函数只有调用后,编译器才会去验证返回类型,所以返回值不能作为函数重载的依据。

内联函数

https://www.runoob.com/cplusplus/cpp-inline-functions.html
1)类内定义的函数都是内联函数,不管是否有inline修饰符
2)函数声明在类内,但定义在类外的看是否有inline修饰符,如果有就是内联函数,否则不是。
如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。

模板

https://www.runoob.com/cplusplus/cpp-templates.html

函数

printf函数

1:字符串长度比设定长度大就按字符串实际长度输出;
2:字符串长度比设定长度小就按右对齐输出该字串,左补空格。
3:如果数字之前有-,即%-5s表示左对齐输出

malloc() C

https://www.runoob.com/cprogramming/c-function-malloc.html

void *malloc(size_t size)
在C中使用malloc时不需要强制类型转换,因为在C中从void*到其他类型的指针是自动隐式转换的;
在C++中使用malloc时必须要强制类型转换,否则会报错,但在c++中一般用new而不用malloc;

#import

  1. 一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include,不是只能用于一种导入。
  2. #import 确定一个文件只能被导入一次,防止重复引用,这使你在递归包含中不会出现问题。

所以,#import比起#include的好处就是不会引起交叉编译。

其他

* SEH

你可能感兴趣的:(语言,c++)