- C++中使用new关键字创建实例时,编译器会为新的实例对象分配一块内存空间,并返回内存空间的首地址,即对象指针,因此不像java一样,new关键字返回的是对象的引用.
- C++中对于未初始化的整形变量,在debug时会输出成-858993460,这是因为debug时,未初始化的变量执行内存0xcccccccc处,而该处存储的值是-858993460,但在release时,未初始化的整形变量会输出0,这是因为release是默认将对象空间内的变量值清零.
- 关于形参和实参的理解,形参传递的是数值,实参传递的地址,举个例子
这段代码其实在内存中可解释为(猜测)void change(int a, int b){ tmp = a; a = b; b= tmp; }
function: change int a; int b; int tmp; tmp = a; a = b; b = tmp; }
可以看出,在编译的时候编译器会自动为change新建两个变量a和b,并将传入的值写入到局部变量a和b的内存空间中.因此change交换的只是临时变量的值,并未改变原来的值.
比如我们在main函数中,执行如下代码:
int main(){ int x = 3; int y = 5; change(x,y); cout<<x<<endl; cout<<y<<endl; }
这是输出的结果仍是3和5,我们并未改变x和y的值,我们改变的只是change方法内局部变量a和b的值。那么我们是怎么知道编译器为change方法新建了两个局部变量a和b的内,我们可以做个试验,在change方法内,我们现实的声明 int a; int b;代码如下:
void change(int a,int b){ int a; int b; }
这是编译器会抛出一个错误,提示我们变量a和b被重复定义了,这说明局部变量a和b已经被定义了,所以我们在change方法内再定义一次的话,肯定会抛出这个错误的.因此可以肯定编译器为change方法新建了两个局部变量a和b.
那么实参传递代码又是如何被解释的呢?还是以change方法为例,代码如下:
void change(int &a, int &b){ int tmp; tmp = a; a = b; b = tmp; }