Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 局部对象的作用域_C++_Object_Scope - Fatal编程技术网

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:返回堆栈分配对象的指针是未定义的行为(从技术上讲,取消引用此类指针是发生未定义行为的地方)