Что такое Java, возвращающий нулевой эквивалент в C ++? - PullRequest
2 голосов
/ 13 октября 2019

Я уже знаю Java и пытаюсь изучить C ++ по некоторым другим причинам. В методе в Java, если вам нечего возвращать или существует недостижимая возвращаемая строка в соответствии с вашей логикой, но вы просто хотите порадовать компилятор, вы просто возвращаете null. Например:

public static int[] /* This can be any Object, and returning null would work */ 5() {
    for(int i = 0; i < 100; i++) {
        if(i == 5) {
            return new int[]{5}; // I don't know why you would want to do this, but I 
                                 // can't think of a better example.
        }
    }

    // The compiler will give an error because there is 
    // no return statement, even though it is guaranteed 
    // to return {5}. So, for convenience, do this:

    return null; 
}

Однако, если я делаю return NULL или даже return nullptr в C ++, это просто выдает ошибку. Есть ли способ, которым я могу обойти это?

Ответы [ 3 ]

3 голосов
/ 13 октября 2019

Как и другие отмечали, есть nullptr. Однако возвращение nullptr означает, что возвращаемое значение является указателем, что означает, что вы, скорее всего, имеете выделение кучи внутри своей функции, которое вам, вероятно, не нужно.

Начиная с C ++ 17 у нас есть std::optional, который вы можете использовать в качестве типа возврата для вашей функции.

Учитывая любой нереферентный тип возврата T, вы можете изменить этот тип возврата на std::optional<T> и вместо nullptr вы вернете либо std::nullopt, либо {}.

Пример:

std::optional<std::string> foo(int x)
{
    if (x > 10)
        return "greater 10";

    return std::nullopt; // or return {}
}

int main()
{
    auto str = foo(12);

    if (str)  // check if str actually has a value or if it's null
        std::cout << *str;  // dereference to get the actual string
    else
        std::cout << "no string returned";

    return 0;
}
3 голосов
/ 13 октября 2019

Это зависит от типа возвращаемого значения вашей функции. Если вы вернете int, вы должны вернуть int. Если вы возвращаете int*, вы можете вернуть nullptr и т. Д. Вы можете получить только nullptr для типов указателей.

Причина, по которой вам разрешено возвращать null при возврате Integerв Java потому, что этот тип уже неявно является ссылочным / указательным типом для int.

В случае, если вы хотите удовлетворить компилятор и вернуть «по умолчанию», вы можете:

return {};

Обратите внимание, что в вашем случае вы действительно хотите вернуть std::array, ваш пример не делает то, что вы думаете, он предпочитает std::array над массивами C.

1 голос
/ 13 октября 2019

Прежде всего в C ++, если вы напишите функцию следующим образом:

struct Buffer {
};

Buffer calculateAndReturnBuffer() {
  // Some computations
  return Buffer{};
}

или что-то вроде этого:

struct Buffer {
};

Buffer calculateAndReturnBuffer() {
  // Some computations
  return {}; // C++ uniform initialization
}

Объект буфера возвращается по значению, это означаетчто в соответствии с основными правилами в C ++ он будет скопирован (но из-за пакета оптимизаций он не будет)

Если вы попытаетесь вернуть null в этом случае:

struct Buffer {
};

Buffer calculateAndReturnBuffer() {
  // Some computations
  return nullptr; // or NULL
}

Это будетне работает, потому что nullptr является типом указателя, а NULL определен для 0, который является целочисленным типом, и эти объекты не могут быть преобразованы в тип буфера. Вам нужно будет сделать следующее:

struct Buffer {
};

Buffer * calculateAndReturnBuffer() {
  // Some computations
  return nullptr; // or NULL
}

или что-то вроде этого:

struct Buffer {
};

Buffer * calculateAndReturnBuffer() {
  // Some computations
  return {}; // C++ uniform initialization
}

Вернуться к вашему вопросу ... Но во всех случаях вы можете использовать фигурные скобки {}

...