c ++方法参数类引用

时间:2013-01-16 19:35:08

标签: c++

我很抱歉问这样一个新手问题。 这是我的问题:

MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass

定义:

method(MyClass c);
我应该定义吗?

method(MyClass* c);

我不想复制代码,正确的方法是什么?

2 个答案:

答案 0 :(得分:2)

你显然是一名Java程序员!首先,您需要这样做:

MyClass* c = new MyClass("test");

请注意c是“指向MyClass的指针” - 这是必要的,因为new表达式为您提供了指向动态分配对象的指针。

现在,要将此传递给一个带有MyClass参数的函数,您需要取消引用指针。也就是说,你会这样做:

method(*c);

请注意,因为该函数采用MyClass值(不是引用),所以该对象将被复制到您的函数中。 MyClass内的method对象将是您之前分配的对象的副本。参数的类型取决于您希望函数执行和传达的具体内容。如果你想要一个对象的引用,那么修改函数内部的对象将修改函数外的c对象,你需要你的函数采用MyClass&参数 - 对{{MyClass的引用1}}。

如果您要将参数设为MyClass*类型,那么您可以这样做:

method(c);

这将为您提供与传递引用类似的语义,因为指针c将被复制到函数中,但指针引用的对象仍将是动态分配的MyClass对象。也就是说,如果在您修改*d的函数内部,c指向的对象也会被修改。

传递这样的原始指针通常不是一个很好的方法。该函数必须显式检查指针是否为null,否则您的程序可能会在某些条件下崩溃。如果您想要传递引用语义,请使用引用类型 - 它就是它们的用途。

但是,最好不要首先动态分配MyClass对象。我猜你只使用new,因为你在Java中做了很多。在C ++中,new表达式用于动态分配对象。通常,您不希望动态分配对象。使用自动存储持续时间创建它是完全正常的,您可以这样做:

MyClass c("test");
method(c);

除非你有充分的理由,否则在C ++中被认为是避免指针和动态分配的非常好的做法。它只会引导您使用更复杂的代码,并且有更多的错误和错误空间。事实上,您提供的代码已经存在问题,因为您没有delete c;。当你按照我刚刚建议的那样做时,你不需要显式删除任何东西,因为当对象超出范围时它将被销毁。

答案 1 :(得分:1)

MyClass *c = new MyClass("test");

method(*c);

如果您定义了method(MyClass c)

之类的方法,它就有效

但是如果你定义像method(MyClass *c);

这样的方法

那么它应该是

MyClass *c = new MyClass("test");
method(c);

这两种选择会产生影响,具体取决于您要对所创建的对象执行的操作。