请回答一些问题并声明以确认或修改。我想确保我做对了,感谢您的任何提示。此外,我可以想象这些示例对于C ++初学者总体而言具有一定的价值。
MyClass c(10);
MyClass c = MyClass(10);
据我了解,这两个对象初始化可以互换使用,对吗?此外,它们超出范围时会自动清除,例如从函数返回。
MyClass* c = new MyClass(10);
该对象需要手动清除,例如“删除c”。
MyClass* getObj() {
MyClass c(10); // stack initiated object
return &c;
}
这将返回一个指向我的堆栈作用域MyClass对象的指针(因为我没有使用new关键字)。事实上,我不应该使用返回给它的指针,因为在使用该对象时,该对象可能已经被清理或稍后失败。正确的 ?
MyClass getObj() {
MyClass c(10); // stack initiated object
return c;
}
在这种情况下,将返回堆栈启动对象的副本,该副本对调用者的范围有效,对吗?
先感谢您。
亲切的问候,赫尔曼
1°)是,尽管为了安全起见,也不应使用该语法,MyClass a(10);
因为您可能会遇到大多数令人烦恼的解析问题。理想情况下,您可以使用以下语法(假定为c ++ 11)来表达初始化而没有任何歧义:
MyClass a{10};
2°)是。但是您应该依靠RAII并在可能的情况下使用智能指针,并希望分配资源。
3°)这很不好,因为返回的指针指向离开函数时(本地对象c
已被销毁)时自动释放的内存。
4°)是的,但是更好的是,使用命名值返回优化,您甚至不应该最终得到副本,因为编译器通常足够聪明,以至于看不到销毁本地对象并返回副本的意义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句