Учитывая следующий код:

[example.h]

class MyClass
{
public:
    MyClass();
    std::string name;
    std::string address;
    bool method (MyClass &object);
};

[example.cpp]

MyClass::MyClass()
{
}
bool MyClass::method (MyClass &object) {
  try {
      object.name = "New Name";
      std::cout << "Name: " << object.name << " " << object.address << std::endl;
      return true;
  }
  catch (...) {
      return false;
  }
}

[test.cpp]

#include "example.h"

int main()
{
    MyClass myC;

    myC.address = "address";
    bool quest = myC.method(myC);
}

В чем разница между способом, которым я назвал myC.method в main выше, и этим альтернативным способом:

MyClass *myC = new MyClass(); 
bool quest = myC.method(*myC); 

Что лучше и почему?

-1
sunset 29 Авг 2011 в 11:44

2 ответа

Лучший ответ

В обоих случаях вы можете отправить одно и то же значение, но лучше просто придерживаться текущего кода, поскольку он без разыменования указателя и new. Вам нужно позаботиться о delete объекте, как только вы закончите с ним, что, я думаю, вам здесь не нужно.

И лучше использовать MyClass &object const в функции method, чтобы переданная ссылка не изменилась.

1
Ryan Li 29 Авг 2011 в 08:00

Использование нового (и динамического распределения памяти в целом) лучше, если вам нужно, чтобы объект прослужил дольше, чем область действия функции, в которой он вызывается. Если это только на известную продолжительность, лучше всего подойдет версия с локальной областью видимости MyClass myC; ( потому что его проще читать и поддерживать).

При использовании new ваш объект "myC" не будет удален, пока вы не вызовете delete.

Однако, если вы просто определите его как локальный объект, он будет удален, когда выйдет за пределы области видимости:

{
 MyClass myC;
 myC.DoSomeStuff();
} // It'll be destroyed here
0
noelicus 30 Авг 2011 в 12:59