C++ C++;对象可见性

C++ C++;对象可见性,c++,visual-c++,C++,Visual C++,两者的区别是什么 std::string a; 及 如果两个对象都是由于方法调用而创建的? 这两个物体在外面都是“可见”的吗?它们什么时候会被摧毁,或者永远不会被摧毁 谢谢。能见度是一样的,寿命是不一样的 一旦a超出范围,第一个字符串将被删除 std::string* a = new std::string(); 第二个字符串将不会被删除,直到您手动调用delete a假设它们都是在方法(函数)中创建的 函数返回后,第一个将被销毁 第二个存在,只要你不调用delete 两者都具有相同的

两者的区别是什么

std::string a;

如果两个对象都是由于方法调用而创建的? 这两个物体在外面都是“可见”的吗?它们什么时候会被摧毁,或者永远不会被摧毁

谢谢。

能见度是一样的,寿命是不一样的

一旦
a
超出范围,第一个
字符串将被删除

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

第二个
字符串
将不会被删除,直到您手动调用
delete a

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

  • 函数返回后,第一个将被销毁
  • 第二个存在,只要你不调用
    delete


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


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

我假设您在函数范围中定义了这些变量

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

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

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

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

std::string a; 
将在当前作用域结束时销毁(通常是结束})

当你调用delete时,它将被销毁(删除)

delete a;

至于可见性,这取决于它在代码中的位置;同样,它将在当前范围(用大括号分隔)中可见,或者如果类的一部分被类访问(public、protected或private)时可见。

区别在于第一种情况:

std::字符串a

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

std::string* a = new std::string();
在第二种情况下:

std::string*a=新的std::string()

a
是指向堆上
std::string
对象的指针,当显式调用
delete a
时,该对象将被销毁


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

可见性和生存期不绑定在一起。例如,函数<代码>静态变量在函数外部不可见,但它在函数调用之后仍然存在。第一个变量是什么?这很容易把乞丐弄糊涂。两个
a
s都会自动销毁。非常感谢,这非常有帮助!
std::string* a = new std::string();
delete a;