【问题标题】:C++ - Scope of Variables Created in a Class MethodC++ - 在类方法中创建的变量范围
【发布时间】:2016-01-18 09:09:19
【问题描述】:

我正在尝试学习 C++,根据我的理解,如果一个变量超出范围,那么它就会被销毁并重新分配它的内存。如果我有一个类并且它的方法创建了一个变量,那么该变量不应该在方法调用之后被销毁吗?例如:

class TestClass {
public:
struct Pair{
    std::string name;
    int value;
};
void addPair() {
    //should be deleted after push_back is called?
    Pair x = Pair{ std::string{ "Test Object " }, counter++ };
    pairs.push_back(x);
}
void printPairs() {
    for (int i = 0; i < pairs.size(); i++) {
        std::cout << "pair { " << pairs[i].name << " : " << pairs[i].value << " } " << std::endl;
    }
}
void removePair() {
    pairs.pop_back();
}
private:
    int counter;
    std::vector<Pair> pairs;
};

但是当我尝试addPair() 然后printPairs() 然后removePair() 它工作正常。为什么它不会抛出一个错误,说对内存位置的访问无效?

【问题讨论】:

  • 您的代码不包含对无效变量的任何访问。您可以编辑您的问题以准确解释您认为问题出在哪里吗?发布您的实际代码而不是描述它会有所帮助。

标签: c++ class variables methods scope


【解决方案1】:

你说:

根据我的理解,如果一个变量超出范围,那么它就会被销毁并重新分配它的内存。

没错。 “重新分配”不是我会使用的正确词。我将其表述为:对象使用的内存可供其他对象使用。

然后你问:

如果我有一个类并且它的方法创建了一个变量,那么该变量不应该在方法调用之后被销毁吗?

没错。

但是,您的情况有所不同。

使用时:

pairs.push_back(x);

x 的副本放置在 pairs 中。函数返回后,副本继续存在于pairs。因此,printPairs()removePair() 工作得很好。

【讨论】:

  • 我对此表示赞同,但我认为澄清 x 是一个类变量实例会有所帮助。然后它可以通过 Pairs 挤出。而且它与 C++ 肤色相得益彰。
  • @DavidPulse,我猜英语不是你的第一语言。我不太明白你想说什么。
【解决方案2】:

首先,访问范围外的变量是未定义的行为。该程序可能会抛出错误,但它可能甚至可以正常工作。所以不能保证会引发错误。

第二,std::vector::push_backmakes a copy of its arguments。因此,将局部变量传递给它时无需担心。

【讨论】:

  • 你的回答完全是修辞。您没有为他定义参考点。您几乎向自己指出,但显然错过了如果您的权利(关于行为)是 50/50。这不是他的问题。他问为什么 Pairs 在通过他的功能跳来跳去之后仍然存在。它们都是相对的。这是一种阶级行为。
  • @DavidPulse “你没有为他定义任何参考点。”具有讽刺意味的是,它比您的答案多一个链接。 “如果你的权利是 50/50” 详细说明。 “它们都是相对的。”你说的是 C++ 吗?
  • 链接是在你干的时候使用的。 “程序可能会抛出错误,但它甚至可能运行良好。因此不能保证会引发错误。” 类变量和方法是相对的。你喜欢拖钓吗?从未涉足。我想我很想念。
  • @DavidPulse "类变量和方法是相对的" 必须是物理:physics.stackexchange.com BTW,C++ 有函数。方法是 C++ 中的“虚函数”。 “链接是在你干的时候用的”显然。 :-)
  • @DavidPulse 给出的答案足以解释 OPs 问题。仅答案的第二段就足够了。为什么要与一个正确的答案争论?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2019-06-08
  • 2012-09-10
  • 2015-11-15
  • 1970-01-01
相关资源
最近更新 更多