我是C++编程的新手,但我有Java经验.我需要有关如何将对象传递给C++中的函数的指导.
我是否需要传递指针,引用或非指针和非引用值?我记得在Java中没有这样的问题,因为我们只传递了保存对象引用的变量.
如果您还可以解释在哪里使用这些选项,那将会很棒.
随着新标准的出现(以及某些编译器中已有的部件),新类型std::unique_ptr应该是替代品std::auto_ptr.
它们的用法是否完全重叠(因此我可以对我的代码进行全局查找/替换(不是我会这样做,但如果我这样做))或者我应该注意一些在阅读文档时不明显的差异?
此外,如果它是一个直接替代品(为什么给它一个新的名称),而不仅仅是改善std::auto_ptr.
我知道标题听起来很熟悉,因为有很多类似的问题,但我要问问题的不同方面(我知道在堆栈上放置东西并将它们放在堆上之间的区别).
在Java中,我总是可以返回对"本地"对象的引用
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
Run Code Online (Sandbox Code Playgroud)
在C++中,要做类似的事情,我有2个选项
(1)每当我需要"返回"一个对象时,我都可以使用引用
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
Thing thing;
calculateThing(thing);
Run Code Online (Sandbox Code Playgroud)
(2)或者我可以返回指向动态分配对象的指针
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
Thing* thing = calculateThing();
delete thing;
Run Code Online (Sandbox Code Playgroud)
使用第一种方法我不必手动释放内存,但对我而言,它使代码难以阅读.第二种方法的问题是,我必须记住delete thing;,这看起来不太好.我不想返回复制的值,因为它效率低(我认为),所以这里提出问题
我想要一份当前运行的实例的副本.
当我更改副本中的值时,原始对象也会受到影响.该副本充当实例.
怎么避免这个?我需要创建一个调用对象的独立副本.
Set operator+(Set s){
Set temp = *this;
for(int i=0; s.elements[i] != '\0'; i++){
temp(s.elements[i]);
}
temp.elements[0] = 'X'; // <- this affects calling object also :(
return temp;
}
Run Code Online (Sandbox Code Playgroud) c++ ×4
auto-ptr ×1
c++-faq ×1
c++11 ×1
performance ×1
pointers ×1
reference ×1
return ×1
unique-ptr ×1