1.malloc free和new delete的区别?
①malloc free是c中的标准函数,new delete是c++中的运算符
②new一个对象时会调用该对象的构造函数,delete时会调用该对象的析构函数,而malloc free不会
③malloc开辟一块空间是默认返回void*类型指针,而new开辟一块空间会自动返回对应类型的指针
④malloc开辟一块空间需要程序员手动的计算分配内存大小(sizeof),new开辟一块空间会根据对应类型智能的计算。
⑤malloc内存分配失败会返回NULL,new内存分配失败时会抛出异常。
2.如何理解float型和double型?
符号位 | 指数位 | 尾数位 | |
float | 1bit | 8bit | 23bit |
double | 1bit | 11bit | 52bit |
①内存空间:float时单精度浮点数,占4个字节32位;double时双精度浮点数,占8个字节64位
②取值范围:float的取值范围为-2^128~2^128,double的取值范围为-2^1024~2^1024
③有效位数:float提供7位有效数字,double提供16位有效数字。
3.指针和引用的区别?
指针是一个变量,指向一块地址。引用时给一个变量取别名。
指针指向的内存空间可以改变,但引用不能。
指针可以指向NULL,但引用不能,引用必须初始化。
指针可以多级,引用不能。(int **p合法,int&&a非法)。
sizeof指针是该指针的大小,sizeof引用是指向变量的大小。
当以指针作为参数传入时,形参会拷贝一份实参,两者指向的内存一样,但不是同一个变量,所以在函数中改变这个变量的指向不影响实参,而引用可以。
4.说明一下C++拷贝构造函数参数要用const&
引用:如果没有引用符号,就是值传递,在调用拷贝构造时,会在次调用拷贝构造创建一个临时的对象,然后这个临时的对象还会再次调用拷贝构造,就会陷入无穷无尽的循环,所以要加上引用符号。
const:const加上时为了防止对引用类型参数数值的意外修改。
5.重载,重定义,重写的区别
重载:重载是静态多态的体现,在编译时体现,是函数的名称相同,函数的返回类型,函数的参数类型,个数,顺序不同,当只有函数的返回类型相同时,不能构成重载,作用范围是在同一个作用域中。
重定义:重定义是子类重新定义父类中相同函数名的非虚函数,函数的参数可以不同,实现了子类对父类方法的隐藏。
重写:重写是动态多态的体现,在运行中体现,重写是在继承关系中,子类重新定义父类中的虚函数,函数的返回类型、参数、函数名完全相同,是在不同的作用域中;
6.宏函数和内联函数的区别?
①宏函数是预处理器对宏进行替代,内联函数是由编译器控制来实现的
②宏函数只是简单的文本替换,而内联函数是直接嵌入到目标代码中。
③宏函数不是真正的函数,没有参数类型检查,是不安全的,内联函数是真正的韩叔叔,有参数类型检查,更安全。
④宏在定义时要注意参数,一般用括号括起来,否则容易出现二义性,内联函数不会出现二义性。