1. C++内存布局分为几个区域,各自具备什么特点?
分为:
栈区:由编译器自动分配和释放,存放函数的参数和局部变量的值等。
堆区:由程序员分配和释放,若程序员不释放可能造成内存泄漏。
全局静态区:用来放置全局变量和静态变量,在程序编译时分配。
文字常量区:用来放置常量字符串。
程序代码区:用来放置函数体包括类的成员函数的二进制代码。
2. 当定义类时,编译器会为类自动生成哪些函数? 这些函数各自都有什么特点?
会生成默认构造函数、默认析构函数、缺省的复制构造函数和缺省的赋值运算符重载函数
构造函数特点:
一旦程序员为类定义了一个构造函数,编译器便不会为类自动生成缺省构造函数,必须显示定义一个无参构造函数,构造函数支持函数重载。构造函数的初始化顺序只与声明时的顺序有关,而与初始化表达式中的顺序无关。
析构函数特点:
与类同名,之前冠以波浪号,以区别于构造函数。析构函数没有返回类型,也不能指定参数,因此析构函数只能有一个,不能被重载。缺省的析构函数是个空的函数体,只清除类的数据成员的空间,但对类的成员变量通过new和malloc动态申请的内存无能为力,因此,对于动态申请的内存,应在类的析构函数中通过delete或free进行释放,否则会造成内存泄漏。
复制构造函数特点:
复制构造函数可以看成是一种特殊的构造函数,创建对象时,只有一个构造函数会被系统自动调用,具体调用哪个取决于创建对象时的参数和调用方式。复制构造函数调用时机是当把一个已经存在的对象赋值给一个新的对象时;或者当实参和形参都是对象,进行形参和实参的结合时;或当函数的返回值是对象,函数调用完成返回时。如果类中含有指针型的数据成员、需要使用动态内存,程序员最好显式定义自己的复制构造函数,避免各种可能出现的内存错误。
赋值运算符重载函数特点:
完成一个对象的各个成员到另一个对象相应成员的复制,其中包括指针成员,与复制构造函数和缺省复制构造函数有些类似,但是如果对象中含指针成员,并且牵扯到类内指针成员动态申请内存时,就需要显式定义自己的赋值运算符重载函数。
3. 什么是浅拷贝, 什么是深拷贝?
系统生成的复制构造函数都是浅拷贝,没有开辟新的空间来存放变量。而深拷贝需要new或malloc新的空间来存在变量。