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;