Когда использовать () с классами? - PullRequest
1 голос
/ 06 июня 2010

Это действительно начинает выводить меня из себя. Когда я их использую, когда нет?

Например, я читал .cpp в связанных списках, объявление класса которых было:

struct CarPart
{
    long PartNumber;
    char Partname[40];
    double UnitPrice;

    CarPart *next;
};

class ListOfParts
{
    int size;

public:
    CarPart *head;

    ListOfParts();
    ~ListOfParts();

    const int count() const;
    void insert( CarPart *item );
    CarPart *retrieve( int pos );
};

С этим кодом, почему мне разрешено писать

ListOfParts *pPart = new ListOfParts();
CarPart *pCarPart = new CarPart;

Для объявления экземпляра ListOfParts требуется (), но не мой CarPart? Это меня смущает. Когда я задавал вопрос раньше, и люди говорили мне, что такое объявление - это функция, которая возвращает объект ListOfParts, но не фактический конструктор. Я предполагаю, что это все еще что-то другое.

Что здесь происходит?

PS: Правильно ли я предположить, что const справа от count () означает, что я не могу изменить какие-либо значения в count?

Ответы [ 3 ]

9 голосов
/ 06 июня 2010

Объявление экземпляра класса ListOfParts не требует () при размещении в куче. Обе формы действительны:

ListOfParts *pPart1 = new ListOfParts();
ListOfParts *pPart2 = new ListOfParts;

РЕДАКТИРОВАТЬ: Как отметили комментаторы, это имеет значение при инициализации Тип POD (однако это не имеет значения к вашему примеру с кодом).

Однако, когда объявляется переменная стека или статическая переменная, это имеет значение, потому что форма с () совпадает с формой объявления функции.

ListOfParts pPart1(); // a function prototype
ListOfParts pPart2; // a object construction

const справа от count() означает, что вы не можете изменить никакие значения внутри текущего объекта в этой функции, которые будут this->size и this->head (обратите внимание, вы все еще можете изменить объект указывает на на head).

2 голосов
/ 06 июня 2010

Как было написано, вы можете использовать обе версии с ():

и без
ListOfParts *pPart = new ListOfParts();

эквивалентно:

ListOfParts *pPart = new ListOfParts;

Бесстыдно скопировано с другого ответа: Excep POD

Модификатор const в объявлении означает, что:

  1. Вы не можете изменять любую переменную этого класса, если она не была объявлена ​​как mutable.

  2. Этот метод можно вызывать, если объект const.

Попробуйте:

#include <iostream>

class test
{
     void testf() {
          std::cout << "void test();" << std::endl;
     }

     void testf() const {
          std::cout << "void test() const;" << std::endl;
     }
 };

 int main() {
      test t;
      t.testf();
      const test &t2 = t;
      t2.testf();
 }
1 голос
/ 06 июня 2010

Что касается вашего post scriptum: да, это означает, что когда вы вызываете count() для экземпляра ListOfParts, вы не можете изменять никакие переменные-члены экземпляра. За исключением случаев, когда они объявлены mutable.

...