为什么Visual Studio对待我的对象的方式有所不同?

时间:2018-07-19 20:58:17

标签: c++ visual-studio

我更改了一个基本的C ++类示例,以查看我是否真的了解OOP的工作原理。我在定义类和另外的rectc(7,8)语句之后立即添加了cout对象。但是,令我感到惊讶的是,rectc并未出现在 locals 标签中。 rectc确实出现在“自动”标签下,但是该图标不同于rectrectb旁边的图标。到底是怎么回事?

// Rectangle Project.cpp : class constructor
//

#include <iostream> 
using namespace std; 

class CRectangle { 
    int width, height;
    public: 
        CRectangle (int, int);
        int area() {
            return (width*height);
        }
} rectc(7,8);

CRectangle::CRectangle (int a, int b) {
    width = a;
    height = b;
} 

int main() {
    CRectangle rect(3, 4);
    CRectangle rectb(5, 6);
    cout << "rect area: " << rect.area() << endl;
    cout << "rectb area: " << rectb.area() << endl;
    cout << "rectc area: " << rectc.area() << endl;
    return 0;
}

1 个答案:

答案 0 :(得分:4)

我没有要检查的VS,但是我的猜测是调试器中的“ Locals”选项卡将仅列出函数局部变量。

由于rectrectb是在main函数中定义的,因此它们在该函数中是“本地的”。如果您试图从函数外部访问它们,则编译器将不允许您访问它们。不仅如此,rectrectb所引用的对象仅与函数一样长。函数返回时(即rectrectb超出范围时),它们将被破坏。

另一方面,

rectc是在main函数的外部中定义的。 rectrectb具有函数局部作用域,而rectc具有全局作用域,可以在任何函数中使用*。因此rectc将不会出现在“本地”调试器标签中。


* 严格来说,这不是正确的。引用rectc的地方仍将需要能够看到其声明。当您的代码分散在多个文件和/或翻译单元中时,这一点很重要。这对您来说可能还不算什么,但是您会到达那里的。