C ++对象可见性

时间:2013-04-30 14:13:11

标签: c++ visual-c++

有什么区别
std::string a;

 std::string* a = new std::string();

如果两个对象都是由方法调用创建的? 两个物体都是“可见的”到外面,什么时候它们会被摧毁还是它们会被摧毁?

感谢。

6 个答案:

答案 0 :(得分:6)

我假设您在功能范围内定义了这些。

存储持续时间

std::string a;

这定义了一个名为a的变量,其类型为std::string。它创建了一个具有自动存储持续时间的std::string类型的对象,这意味着当变量超出范围时它将被销毁。

std::string* a = new std::string();

这定义了一个名为a的变量,其类型为std::string*(指向std::string的指针)。它创建了一个具有自动存储持续时间的std::string*类型的对象,这意味着当变量超出范围时它将被销毁。也就是说,指针将在范围的末尾被销毁。

使用 new-expression new std::string()初始化此指针。此表达式动态分配std::string对象并返回指向它的指针。此对象具有动态存储持续时间,必须使用delete a;手动删除。这会破坏a指向的对象。

可见性

可见性是名称的属性,而不是对象的属性。在这两种情况下,声明的名称a在范围内时都可见,而不是隐藏。

答案 1 :(得分:4)

可见性是相同的,生命周期不是。

string超出范围时,第一个a将被删除。

在您手动拨打string之前,第二个delete a;将被删除

答案 2 :(得分:1)

假设它们都是在方法(函数)中创建的。

  • 一旦函数返回,第一个就会被销毁。
  • 只要你不打电话给delete,第二个就会活着。

string* flunk() {
    std::string str;
    std::string* str_p = new std::string; // This lives on

    return str_p;
    // str->~();  destructed here. 
}

答案 3 :(得分:1)

两者具有相同的可见性,这取决于它们的声明位置。

第一个字符串在变量范围的末尾自动处理。第二个不会被删除,除非并且直到使用存储在变量中的地址调用delete

答案 4 :(得分:1)

std::string a; 

将在当前范围结束时销毁(通常是关闭})。

std::string* a = new std::string();
当你在上面调用删除时,

将被销毁(删除)。

delete a;

至于可见性,它取决于代码中的位置;再次,它将在当前范围(由大括号分隔)中显示,或者由类访问(公共,受保护或私有)的类的一部分可见。

答案 5 :(得分:1)

区别在于第一种情况:

std::string a;

在堆栈上创建std::string对象。当对象超出范围时,它会自动销毁。

在第二种情况下:

std::string* a = new std::string();

a是堆上std::string对象的指针,当您明确调用delete a时会被销毁。

关于可见性,两者都在当前范围内可见。