C++ 局部对象的作用域
可能重复:C++ 局部对象的作用域,c++,object,scope,C++,Object,Scope,可能重复: 这是一个示例程序,用于检查函数中本地类对象的范围。在这里,我创建了一个类A的对象,并给它赋值,然后在Function()中通过引用返回该对象。我想知道变量的作用域何时结束?因为它是一个堆栈对象(不是指针),它是否会在函数()的末尾被销毁?如果是这样,将其参考值指定给新对象时会发生什么情况 #include "stdafx.h" #include <iostream> class A { public: int a, b; A(in
这是一个示例程序,用于检查函数中本地类对象的范围。在这里,我创建了一个类A的对象,并给它赋值,然后在
Function()
中通过引用返回该对象。我想知道变量的作用域何时结束?因为它是一个堆栈对象(不是指针),它是否会在函数()的末尾被销毁?如果是这样,将其参考值指定给新对象时会发生什么情况
#include "stdafx.h"
#include <iostream>
class A
{
public:
int a, b;
A(int aa, int bb)
{
a = aa;
b = bb;
}
A(){}
};
A& Function()
{
A object;
object.a = 10;
object.b = 20;
return object;
}
int _tmain(int argc, _TCHAR* argv[])
{
A aaa = Function();
std::cout<<"\nValue : "<<aaa.a<<" "<<aaa.b;
getchar();
return 0;
}
#包括“stdafx.h”
#包括
甲级
{
公众:
INTA,b;
A(内部aa,内部bb)
{
a=aa;
b=bb;
}
A(){}
};
函数()
{
物体;
对象a=10;
对象b=20;
返回对象;
}
int _tmain(int argc,_TCHAR*argv[]
{
A aaa=函数();
标准::cout
由于它是一个堆栈对象(不是指针),它是否将在函数()的末尾被销毁
对
如果是这样,将其参考值指定给新对象时会发生什么情况
#include "stdafx.h"
#include <iostream>
class A
{
public:
int a, b;
A(int aa, int bb)
{
a = aa;
b = bb;
}
A(){}
};
A& Function()
{
A object;
object.a = 10;
object.b = 20;
return object;
}
int _tmain(int argc, _TCHAR* argv[])
{
A aaa = Function();
std::cout<<"\nValue : "<<aaa.a<<" "<<aaa.b;
getchar();
return 0;
}
未定义的行为
如果你创建的东西是为了返回它,那么就按值返回它。这就是值的作用
由于它是一个堆栈对象(不是指针),它是否将在函数()的末尾被销毁
对
如果是这样,将其参考值指定给新对象时会发生什么情况
#include "stdafx.h"
#include <iostream>
class A
{
public:
int a, b;
A(int aa, int bb)
{
a = aa;
b = bb;
}
A(){}
};
A& Function()
{
A object;
object.a = 10;
object.b = 20;
return object;
}
int _tmain(int argc, _TCHAR* argv[])
{
A aaa = Function();
std::cout<<"\nValue : "<<aaa.a<<" "<<aaa.b;
getchar();
return 0;
}
未定义的行为
如果你创建的东西是为了返回它,那么就按值返回它。这就是值的作用
发生了什么事?
未定义的行为就是这样发生的
堆栈分配的对象是本地/自动的,因为一旦这些对象所在的作用域({
,}
)结束,这些对象的所有分配都将被隐式清理
返回对本地对象的引用是一种未定义的行为。
未定义的行为意味着任何行为都可以被看到。程序可能会工作或可能崩溃或行为随机。只是它不是一个有效的C++程序,任何事情都可能发生。
发生了什么事?
未定义的行为就是这样发生的
堆栈分配的对象是本地/自动的,因为一旦这些对象所在的作用域({
,}
)结束,这些对象的所有分配都将被隐式清理
返回对本地对象的引用是一种未定义的行为。
未定义的行为意味着任何行为都可以被看到。程序可能会工作或可能崩溃或行为随机。只是它不是一个有效的C++程序,任何事情都可能发生。 < p>这个对象将在<代码>函数()/<代码>的结尾被破坏。
通过值传递机制返回数据。对象将在函数()的末尾被销毁。
。
通过传递值机制返回数据。我相信您的问题在这里得到了回答:
但是,它有点旧。您可能需要研究C++11、右值引用和移动语义。我相信您的问题在这里得到了回答:
但是,它有点旧。您可能需要研究C++11、右值引用和移动语义。如果我将堆栈对象更改为指针,也会发生相同的行为。对???@AjeshPN:如果您按值从函数返回动态分配的指针,则接受返回指针的指针将指向动态内存它会很好地工作。@AjeshPN:返回指向堆栈分配对象的指针是未定义的行为(从技术上讲,取消引用这样的指针是未定义行为发生的地方)如果我将堆栈对象更改为指针,也会发生同样的行为。对???@AjeshPN:如果您通过值从函数返回一个动态分配的指针,那么接受返回指针的指针将指向动态内存,并且可以正常工作。@AjeshPN:返回堆栈分配对象的指针是未定义的行为(从技术上讲,取消引用此类指针是发生未定义行为的地方)