c++局部变量的销毁问题。
我在某个函数里定义了一些局部变量,如inti;和staticinta;请问在我调用完函数以后他们是否都会自动销毁呢?...
我在某个函数里定义了一些局部变量,如int i;和static int a;请问在我调用完函数以后他们是否都会自动销毁呢?
展开
7个回答
展开全部
1,所谓不能返回局部变量,是指局部变量在栈空间中分配内存,函数返回时栈指针回退,当主调函数继续调用其它被调函数时,栈指针上移,上一次函数调用所分配的空间会被本次调用覆盖,如果此时再引用原来的局部变量就会出现不可预见的结果。
所以局部变量在函数返回时并不是被销毁而是相当于可被再次利用。
所以如果第一题你在cout<<x<<endl;前调用一函数,此函数大量分配局部变量,后面的输出值必变!
2。第二题要明确构造函数是在对象构造时调用的,而不是在对象间相互赋值时调用的,你的comp3在对象在申明时已经调用了Complex(double r=0,double i=0).如果你这样写:" Complex comp3=comp1.operator+(comp2); //用对象 接收函数返回的引用" 则拷贝构造函数必被调用到。
所以这样对于"局部对象C的地址&C和《用对象 接收函数返回的引用》的对象comp3地址不同。。。 "应该理解的吧。
补充:向你这样把返回的引用赋给变量是无论怎么都不会变的,因为返回时进行了变量的复制(不一定是调用构造函数),要改变其实我上面已经说了只要在cout<<X前调用一个函数且函数内定义了局部变量即可:
int &x= ABC(); //必须定义成引用
test();
cout<<x;
void test()
{
int a=8;
}
这样X的输出将是8,下题类似不再举例.
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
所以局部变量在函数返回时并不是被销毁而是相当于可被再次利用。
所以如果第一题你在cout<<x<<endl;前调用一函数,此函数大量分配局部变量,后面的输出值必变!
2。第二题要明确构造函数是在对象构造时调用的,而不是在对象间相互赋值时调用的,你的comp3在对象在申明时已经调用了Complex(double r=0,double i=0).如果你这样写:" Complex comp3=comp1.operator+(comp2); //用对象 接收函数返回的引用" 则拷贝构造函数必被调用到。
所以这样对于"局部对象C的地址&C和《用对象 接收函数返回的引用》的对象comp3地址不同。。。 "应该理解的吧。
补充:向你这样把返回的引用赋给变量是无论怎么都不会变的,因为返回时进行了变量的复制(不一定是调用构造函数),要改变其实我上面已经说了只要在cout<<X前调用一个函数且函数内定义了局部变量即可:
int &x= ABC(); //必须定义成引用
test();
cout<<x;
void test()
{
int a=8;
}
这样X的输出将是8,下题类似不再举例.
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int i;会销毁
static int i;不会销毁
static是静态变量,相当于一个全局变量,所以生命周期是整个程序运行的期间,而int i是动态的,生命在一个函数内,也就是说,一个函数调用结束,它就销毁了.
static int i;不会销毁
static是静态变量,相当于一个全局变量,所以生命周期是整个程序运行的期间,而int i是动态的,生命在一个函数内,也就是说,一个函数调用结束,它就销毁了.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数中的非static变量会销毁,static不会,static 在main结束后销毁
函数中的非static变量存储在函数的堆栈里面,而static存放咋静态存储区,存储的位置不同
函数中的非static变量存储在函数的堆栈里面,而static存放咋静态存储区,存储的位置不同
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int i;会
static int i;不会 static 等程序都运行完才会
static int i;不会 static 等程序都运行完才会
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询