1、声明和定义的区别
答:声明(declare)未必会申请内存空间,定义会申请内存空间;对于普通的常规类型,比如int a,声明即定义,但A a 和A a = new A()有明显区别;
2、指针和引用的区别
答:指针是真的开辟内存空间存储地址,引用是原变量的别名。
3、sizeof是在编译时取值还是在运行时取值?
对于支持查看动态数组的c99及以后,是运行时取值;其他为编译时取值。
4、程序运行内存分配
代码区:二进制代码,不可更改
常量区:const修饰的字符。
静态区:静态变量和全局变量。
堆区:程序员分配的内存空间。
栈区:函数调用
PS.栈的地址是连续的,对于堆:1次地址一定连续,几次申请的地址未必连续。
5、new、delete和malloc free的区别
new delete是关键字,malloc free 是库函数;new可以自动按合适大小分配内存,malloc需要sizeof;对于非pod类型的数据,用new,因为new会自动改allocater
上面错在用malloc,malloc没有改stl里的allocater。
6、explicit关键字:规定某函数不能用于隐式转换和复制初始化。
例如:原构造函数
class Point{
public:
int x, y;
Point(int a = 0,int b = 0):x(a),y(b){};
};
void showPoint(Point _A)
{
cout<<"("<<_A.x<<","<<_A.y<<")"<<endl;
}
目前程序调用showPoint(1),调用构造函数会隐式转换,默认构造一个Point为(1,0)的对象。
如果加上explic,将不允许showPoint通过复制构造函数构建一个Point为(1,0)的对象
class Point{
public:
int x, y;
explicit Point(int a = 0,int b = 0):x(a),y(b){};
};
void showPoint(Point _A)
{
cout<<"("<<_A.x<<","<<_A.y<<")"<<endl;
}