引用与指针有什么区别? 指针申请一块内存,它的内容是所指内存的地址;引用是某块内存的别名,不申请内存。 引用只能在定义时被初始化一次,之后不可变;指针可变; 引用不能为空,指针可以为空; 引用使用时无需解引用*,指针需要解引用; sizeof 引用得到的是所指向的变量/对象的大小,而sizeof 指针得到的是指针本身的大小;
const与#define有什么区别? #define是替换,在预处理阶段进行,不会分配内存,在调试器里看不到,没有具体类型,也不会去做类型检查。 const对象的值在调试器中可以看到,对const对象应用取地址运算符是合法的,分配内存,并且会有具体类型,会做类型检查 。
构造函数、析构函数可以是虚函数?为什么? 构造函数不能是虚函数,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。 析构函数可以是虚函数,而且通常声明为虚函数。类里面static和const可以同时修饰成员函数吗? 不可以,由于C++编译器在实现const的成员函数时为了确保函数不能修改类中的参数的值,会在函数中添加一个隐式的参数’const this*’。但加上static时,该函数会没有this指针,导致const与static用法冲突class与struct的区别? 1.默认的访问控制不同 struct是public class是private 2.struct可以使用花括号内的初始值列表{...}初始化,class不可以(C++98不可以,C++11可以)。虚函数与纯虚函数的区别? 虚函数:可以被调用 纯虚函数:是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加=0,不会被调用new/delete与alloc()/free()的区别? 特征new/deletemalloc/free分配内存的位置自由存储区堆内存分配成功的返回值完整类型指针void*内存分配失败的返回值默认抛出异常返回NULL分配内存的大小由编译器根据类型计算得出必须显式指定字节数处理数组有处理数组的new版本 new 类型[] delete [] 数组需要用户计算数组的大小后进行内存分配已分配内存的扩充无法直观的处理使用realloc简单完成是否相互调用可以,看具体的operator new/delete实现不可调用new分配内存时内存客户能够指定处理函数制定分配器无法通过用户代码进行处理函数重载允许不允许构造函数与析构函数调用不调用9. extern "C"作用 extern关键字:在一个项目中必须保证函数、变量、枚举等在所有的源文件中保持一致,除非你指定定义为局部的。 extern "C"指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言 extern "C"的真实目的是实现类C和C++的混合编程。在C++源文件中的语句前面加上extern "C",表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。 10. const有哪些用法? ·const 与 指针 类型* const 变量=初始值 //指向的地址不能改变 const 类型* 变量=初始值 //指向的内容不能被改变 类型 const 类型* 变量 = 初始值 const 类型* const 变量=初始值 //指向的内容和地址都不能改变
const 与 引用 类型 const & 变量=初始值 const 类型& 变量=初始值 引用对象不能改变
const 与 参数和返回值 返回值类型 函数(const 类型 形参)//函数内部不该变参数的值,只做输入 const 返回值类型 函数(形参列表)//函数返回值不能被改变
const 与 成员变量 不能被改变,不能赋值运算符重载, 可以使用构造函数和拷贝构造函数。 const 类型 成员变量;
const 与 成员函数 表示函数不改变成员变量的值 返回值 函数(参数)const{}
const修饰位置(作用) 变量(不可修改,替代#define) 对象/实例(对象的成员变量不可修改,只能调用const成员函数) 函数参数(参数不能在函数内部修改,只做为入参) 函数返回值(返回的结果不能被修改,常用于字符串) const char* str=string.c_str 成员变量(只能在初始化列表中初始化) 成员函数(不改变成员变量)