int i,这种类型的局部变量在栈上,函数退出后,栈上的数据就无效了,static int a这种类型的在全局段上,在整个程序的生命周期上都是不会销毁的,如果变量的空间是由new或malloc,calloc等动态分配函数分配的,那么是在堆空间上,需要使用delete或free来销毁
1,所谓不能返回局部变量,是指局部变量在栈空间中分配内存,函数返回时栈指针回退,当主调函数继续调用其它被调函数时,栈指针上移,上一次函数调用所分配的空间会被本次调用覆盖,如果此时再引用原来的局部变量就会出现不可预见的结果。
所以局部变量在函数返回时并不是被销毁而是相当于可被再次利用。
所以如果第一题你在cout<
2。第二题要明确构造函数是在对象构造时调用的,而不是在对象间相互赋值时调用的,你的comp3在对象在申明时已经调用了Complex(double r=0,double i=0).如果你这样写:" Complex comp3=comp1.operator+(comp2); //用对象 接收函数返回的引用" 则拷贝构造函数必被调用到。
所以这样对于"局部对象C的地址&C和《用对象 接收函数返回的引用》的对象comp3地址不同。。。 "应该理解的吧。
补充:向你这样把返回的引用赋给变量是无论怎么都不会变的,因为返回时进行了变量的复制(不一定是调用构造函数),要改变其实我上面已经说了只要在cout<
test();
cout<
void test()
{
int a=8;
}
这样X的输出将是8,下题类似不再举例.
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
int i;会销毁
static int i;不会销毁
static是静态变量,相当于一个全局变量,所以生命周期是整个程序运行的期间,而int i是动态的,生命在一个函数内,也就是说,一个函数调用结束,它就销毁了.
函数中的非static变量会销毁,static不会,static 在main结束后销毁
函数中的非static变量存储在函数的堆栈里面,而static存放咋静态存储区,存储的位置不同
int i;会
static int i;不会 static 等程序都运行完才会