基本数据类型的等级从低到高如下: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
dynamic_cast 只能转换指针类型和引用类型
https://www.runoob.com/w3cnote/cpp-static-usage.html
目的是将函数中此变量的值保存至下一次调用。
全局(静态)存储区
DATA 段(全局初始化区)存放初始化的全局变量和静态变量;
BSS 段(全局未初始化区)存放未初始化的全局变量和静态变量。
在 C++ 中 static 的内部实现机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
不能在类的声明中定义,也不能在头文件中类声明的外部定义。
静态变量存储在程序的静态存储区而非栈上空间。
static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以;static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化,如果没有显式初始化,会被程序自动初始化为0。
它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
类的非静态成员函数可以调用用静态成员函数,但反之不能。
类的静态成员变量必须先初始化再使用。
静态成员函数没有 this 指针。
普通的变量,不管是否声明为auto,都是自动型变量。
也可以显式声明为auto变量。
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
什么样的函数不能声明为虚函数?
不能把返回值作为函数重载的条件,原因是编译器在编译时不会去判断函数的返回类型,函数只有调用后,编译器才会去验证返回类型,所以返回值不能作为函数重载的依据。
https://www.runoob.com/cplusplus/cpp-inline-functions.html
1)类内定义的函数都是内联函数,不管是否有inline修饰符
2)函数声明在类内,但定义在类外的看是否有inline修饰符,如果有就是内联函数,否则不是。
如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。
https://www.runoob.com/cplusplus/cpp-templates.html
1:字符串长度比设定长度大就按字符串实际长度输出;
2:字符串长度比设定长度小就按右对齐输出该字串,左补空格。
3:如果数字之前有-,即%-5s表示左对齐输出
https://www.runoob.com/cprogramming/c-function-malloc.html
void *malloc(size_t size)
在C中使用malloc时不需要强制类型转换,因为在C中从void*到其他类型的指针是自动隐式转换的;
在C++中使用malloc时必须要强制类型转换,否则会报错,但在c++中一般用new而不用malloc;
所以,#import比起#include的好处就是不会引起交叉编译。