- const的作用?
const修饰的变量为常量,只可读
const可以修饰参数和成员函数,修饰成员函数可以保证类的成员变量的值不会被修改
class A
{
public :
int value;
void fun() const {
int data = 1;
data++; // 可以修改
value++; // 错误,无法修改
}
}
-
指针和引用的区别
指针是一个变量,存放的是一个变量的地址,引用是一个变量的别名
引用只能在初始化时被赋值,不能被改变,指针的值可以在任何时候被改变
引用不能为NULL,指针可以为NULL
引用不能被修改,而指针可以(看到的修改是把原变量的值行的修改了) -
malloc/free, new/delete的不同
malloc/free是c++/c的库函数,而new/delete是c++的运算符。他们的作用都是动态申请内存和释放内存。
new可以动态申请空间及初始化,delete可以释放空间。malloc/free无法执行构造函数和析构函数。 -
计算机中堆和栈的区别(不是数据结构中的堆栈)
堆区的空间是手动分配的(new出来的)和释放的, 栈区的空间是系统自动分配和释放
堆区存放的手动分配的变量
栈区存放的是局部变量,参数变量
扩展
全局区(静态存储区static)存放的是全局变量和静态变量
文字常量区存放的是常量字符串
程序代码区存放函数的二进制代码 -
不调用C/C++ 的字符串库函数,编写strcpy
char * strcpy(char * strDest,const char * strSrc) {
if ((strDest==NULL)||strSrc==NULL))
return NULL;
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0');
*strDest = '\0';
return strDestCopy;
}
-
static的作用
static修饰的变量为静态变量,静态变量只初始化一次,若不赋值,默认值为0
static修饰成员变量,类的所有对象共享
static修饰成员函数,调用时可直接使用函数名,静态函数里无this指针(this指针是本身这个对象),静态成员函数(理论上)只能访问静态变量 -
头文件种的ifndef/define/endif 的作用
防止头文件被重复包含 -
进程和线程的区别
线程是调度和分派的基本单位,进程是拥有资源的基本单位
进程拥有资源,而线程不拥有资源但可以访问隶属于进程内的资源
在创建进程时,系统要为进程申请和释放资源,导致系统的开销明显大于创建线程时的系统开销 -
进程中的通信方式
管道系统,共享存储系统, 消息传递系统 -
c和c++的区别
c采用的是面向过程的思想,重点在算法和数据结构,c++是面向对象的的思想
是c的超集,c++还具有封装,继承,多态 -
什么是内存泄漏
内存泄漏指的是手动分配空间使用完之后,没有释放空间 -
什么是野指针
野指针不是NULL指针,是指指向“垃圾”内存的指针。即指针指向的内容是不确定的。
产生的原因:定义后没有初始化或者指针释放之后没有设为NULL -
构造函数和析构函数的执行顺序
构造函数
1). 首先调用父类的构造函数;
2). 调用成员变量的构造函数;
3). 调用类自身的构造函数。
析构函数–与析构函数完全相反 -
为什么析构函数必须是虚函数?
父类的指针指向子类的对象时,当释放基类指针时,如果不是虚析构函数就无法释放掉子类对象的内存空间,防止内存释放 -
map和set有什么区别,分别又是怎么实现的?
map和set都是C++的关联容器,其底层实现都是红黑树(RB-Tree)。 -
C++中struct和class的区别?
在C++中,可以用struct和class定义类,都可以继承。区别在于:struct的默认继承权限和默认访问权限是public,而class的默认继承权限和默认访问权限是private。 -
一个C++源文件从文本到可执行文件经历的过程?
预处理->编译->汇编->链接
预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。
编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件
链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件 -
变量的声明和定义有什么区别?
声明变量不分配空间,定义变量要分配空间。声明主要是告诉编译器,后面的引用都按声明的格式。定义其实包含了声明的意思,同时要分配内存空间。 -
在C++程序中调用被C编译器编译后的函数,为什么要加extern"C"?
C++语言支持函数重载,C语言不支持函数重载。 -
虚函数的作用是什么?
多态:调用同一个函数名,可以根据需要但实现不同的功能。
主要是运行时多态。
若要访问派生类中相同名字的函数,必须将基类中同名函数定义为虚函数,这样,将不同的派生类对象的地址赋值给基类指针变量后,就可以动态的调用不同类中的函数。
在派生类中重新定义基类中的虚函数时,可以不用关键字virtual来修饰这个成员函数。