C++知识一

这里写目录标题

      • 数组指针
      • 指针访问二维数组
      • 派生类的构造函数
      • case没有break会顺序执行(不只是default,后面的case情况都会执行)
      • 函数的定义不能嵌套,但是调用可以嵌套。
      • 不可以重写私有的虚方法。
      • 运算符优先级
      • C++的强制类型转换 reinterpret_cast
      • sizeof
      • 属于友元函数的 运算符重载函数

数组指针

C++知识一_第1张图片

int(*n)[10]; 是数组指针 sizeof(n)=4

int* n[10]; 是指针数组 sizeof(n)=40

数组指针 ,只要是指针就4个字节。
n先与* 结合,所以,n是一个指针,既然是一个指针,而且是在32位操作系统下,那么n就占32位,4个字节。
C内核解析指针:指针数组实质是一个数组,数组内元素全部是指针变量; 数组指针实质是一个指针,该指针指向一个数组; 区分两者,
若核心和星号*结合,表示核心是指针如int (*n)[10];
若核心和中括号[]结合,表示核心是数组,如 int p[10];
若核心和小括号结合,表示核心是函数,如int q();
遇到操作符优先级问题,看优先级高低,其中()、[ ]、->优先级高于

故,这里sizeof(n):4
C++知识一_第2张图片
在这里插入图片描述

指针访问二维数组

C++知识一_第3张图片
竟然错了呜呜呜
*(b+i)

*(b[i]+j)
是一个套路,只不过第二个b【i】事先访问了一维,再来一次就是二维

参考答案中的解释: *b+i为b[0][i],取地址加j相当于b[j][i]❌❌❌
正确应该是:相当于先访问了 b 中0行 i列的元素后在给元素 + j

派生类的构造函数

C++知识一_第4张图片

case没有break会顺序执行(不只是default,后面的case情况都会执行)

C++知识一_第5张图片

函数的定义不能嵌套,但是调用可以嵌套。

不可以重写私有的虚方法。

重写伴随着继承,但是私有成员函数在继承后不可见,所以不能被重写 ???

运算符优先级

(a++)返回值也是 3
SUB(a++,++b) = (a++)++b = (3++)++4 = 3*5 = 15
C++知识一_第6张图片

C++知识一_第7张图片
第一级:
圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】

第二级:
逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ –】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】

乘法运算符【*】、除法运算符【/】、取余运算符【%】

加法运算符【+】、减法运算符【-】

左移动运算符【<<】、右移动运算符【>>】

关系运算符【< > <= >= 】
等于运算符【==】、不等于运算符【!=】

按位与、或(&、^、|)
逻辑运算符 与、或(&&、||)
条件运算符【?:】
赋值运算符【= += -= *= /= %= >>= <<.= &= |= ^=】

简练
()> !(单目运算符) > 算术运算符(加减乘除自增等等) > 移位运算符(左移右移)> 关系运算符(>=、!=) > 逻辑运算符(&、|、&& 、 ||) >条件运算符【?:】> 赋值运算符(【= += -= *= /= %= >>= <<.= &= |= ^=】)

C++的强制类型转换 reinterpret_cast

  • 1
    C++知识一_第8张图片
    类型步长不一致
  • 2
    C++知识一_第9张图片
    dynamic_cast是运行时检查,虽然pb1是A1类型的,但是指向的实体却是子类,所以子类转父类A2完全是可以的。
    但是static_cast比较“死脑筋”,在编译期检查,这样是不检查指针指向的值的,于是发现pb1是A1类型,A1想转A2?报错!

作者:lpplgg
链接:https://www.nowcoder.com/exam/test/71983008/submission?pid=51693538&pageSource=testHistory
来源:牛客网

C语言中的强制类型转换(Type Cast)有显式和隐式两种,显式一般就是直接用小括号强制转换,TYPE b = (TYPE)a; 隐式就是直接 float b = 0.5; int a = b; 这样隐式截断(by the way 这样隐式的截断是向 0 取整的,我喜欢这么叫因为 0.9 会变成 0,1.9 变成 1,-0.9 变成 0,-1.9 变成 -1)。
C++对C兼容,所以上述方式的类型转换是可以的,但是有时候会有问题,所以推荐使用C++中的四个强制类型转换的关键字:
  1、static_cast,2、const_cast,3、reinterpret_cast,4、dynamic_cast

Const_cast:把const变量转换成非const。
Static_cast:用于各种隐式转换,比如非const转const,void*转指针等。
C++知识一_第10张图片

static_cast 是“静态转换”的意思,也就是在编译期间转换,转换失败的话会抛出一个编译错误。
Dynamic_cast:用于动态转换。只能用于含有虚函数的类向上或向下转换,比如父类转子类,子类转父类。
Reinterpret_cast:几乎什么都可以转,但是可能出问题,不推荐使用。
为什么不用C的强制转换?
C的强制转换,转化不明确,不能错误检查,容易出错。

原文链接:https://blog.csdn.net/qq_42328339/article/details/101445258
原文链接

sizeof

C++知识一_第11张图片

C++语言中的确规定了空结构体和空类所占内存大小为1(讲究预留?若结构体为空,其大小为1;若不为空,结构体的存储比较复杂,需要考虑内存存储的字节对齐。==需要考虑内存存储的字节对齐==厉害了这个!),而C语言中空类和空结构体占用的大小是0。

属于友元函数的 运算符重载函数

在这里插入图片描述
因为+是双目运算符,但是函数里只传了一个参数,就必然使用了this指针,那就肯定不是友元函数了

  • 因为友元函数没有当前对象,因此要定义单目运算符,就需要单参函数,要定义双目运算符,就需要双参函数;

  • 定义后置“++"或后置“–"运算是特例,它们是单目运算符,但需要两个形参,头一个形参是作用对象,后一个是int形参;

  • 用友元函数可以定义成员函数不能实现的运算,例如一些双目运算符,右操作数是本类对象,而左操作数不是本类对象;

  • 成员函数体中,当前对象作为一个操作数,无形参形式可以定义单目运算符

作者:Geng1995
链接:https://www.nowcoder.com/exam/test/72063274/submission

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