Должны бесполезные спецификаторы типа на типах возврата использоваться для ясности?

  1. Это полностью ваше дело. Я обычно запускаю со всех переменных, затем конструкторы, затем методы, но это - просто персональное предпочтение.
  2. названия аргументов абсолютно не важны, пока Вы не называете их тем же самым как Ваши переменные. В этом примере, gear, cadence, и speed переменные.
  3. Вы (или кто-то), передача три ints конструктору. Имена (startCadence, startSpeed, и startGear названы эти формальные параметры , и они - способ, которым можно определить аргументы. См. http://en.wikipedia.org/wiki/Parameter_ (computer_science) .
    gear, cadence, и speed определяются где-то в другом месте в классе. Любой метод в классе может относиться к ним.
  4. не волнуются - если Вы будете работать в нем, то этот вид вещи будет второй натурой довольно скоро.

    , О, и я могу предложить, чтобы Вы получили хороший IDE? BlueJ, как предполагается, хорош для новичков, и NetBeans и Eclipse для более опытных программистов. Выделение исходного кода может быть неоценимым.

11
задан casperOne 6 April 2012 в 16:56
поделиться

6 ответов

Обычно лучше, чтобы ваш код как можно точнее описывал происходящее. Вы получаете это предупреждение, потому что const в const int foo (); в основном бессмысленны. API кажется более понятным, только если вы не знаете, что означает ключевое слово const . Не перегружайте смысл подобным образом; static и так уже достаточно плохи, и нет никаких причин добавлять потенциальную путаницу.

const char * означает нечто иное, чем const int , что вот почему ваш инструмент не жалуется на это. Первый является указателем на постоянную строку, что означает, что любой код, вызывающий функцию, возвращающую этот тип, не должен пытаться изменить содержимое строки (например, это может быть в ПЗУ). В последнем случае у системы нет способа заставить вас не вносить изменения в возвращаемый int , поэтому квалификатор не имеет смысла. Более близкой параллелью с типами возврата будет:

const int foo();
char * const foo2();

, которые заставят ваш статический анализ выдать предупреждение - добавление квалификатора const к возвращаемому значению является бессмысленной операцией. Это имеет смысл только тогда, когда у вас есть ссылочный параметр (или тип возвращаемого значения), как в вашем примере const char * .

Фактически, я только что написал небольшую тестовую программу, и GCC даже явно предупреждает об этом проблема:

test.c:6: warning: type qualifiers ignored on function return type

Значит, жалуется не только ваша программа статического анализа.

const int foo();
char * const foo2();

, что заставит ваш статический анализ выдать предупреждение - добавление квалификатора const к возвращаемому значению - бессмысленная операция. Это имеет смысл только тогда, когда у вас есть ссылочный параметр (или тип возвращаемого значения), как в вашем примере const char * .

Фактически, я только что написал небольшую тестовую программу, и GCC даже явно предупреждает об этом проблема:

test.c:6: warning: type qualifiers ignored on function return type

Значит, жалуется не только ваша программа статического анализа.

const int foo();
char * const foo2();

, что заставит ваш статический анализ выдать предупреждение - добавление квалификатора const к возвращаемому значению - бессмысленная операция. Это имеет смысл только тогда, когда у вас есть ссылочный параметр (или тип возвращаемого значения), как в вашем примере const char * .

Фактически, я только что написал небольшую тестовую программу, и GCC даже явно предупреждает об этом проблема:

test.c:6: warning: type qualifiers ignored on function return type

Значит, жалуется не только ваша программа статического анализа.

25
ответ дан 3 December 2019 в 01:20
поделиться

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

#define CONST_RETURN

CONST_RETURN int foo();

У вас нет проблем с const char * , потому что он объявляет указатель на постоянные символы, а не на постоянный указатель.

5
ответ дан 3 December 2019 в 01:20
поделиться

Да. Я бы посоветовал писать код «явно», потому что он дает понять всем (включая вас) при чтении кода, что вы имели в виду. Вы пишете код для других программистов, чтобы они читали , а не для удовлетворения прихоти компилятора и инструментов статического анализа!

(Однако вы должны быть осторожны, чтобы любой такой «ненужный код» не был приводит к генерации другого кода!)

Некоторые примеры явного кодирования, улучшающего читаемость / ремонтопригодность:

  • Я заключаю в скобки части арифметических выражений, чтобы явно указать, что я хочу сделать. Это дает понять любому читателю, что я имел в виду, и избавляет меня от необходимости беспокоиться (или делать ошибки с) правилами приоритета:

     int a = b + c * d / e + f; // Трудно читать - нужно знать приоритет
    int a = b + ((c * d) / e) + f; // Легко читать - ясные явные вычисления
    
  • In C++, if you override a virtual function, then in the derived class you can declare it without mentioning "virtual" at all. Anyone reading the code can't tell that it's a virtual function, which can be disastrously misleading! However you can safely use the virtual keyword:

    virtual int MyFunc()
    and this makes it clear to anyone reading your class header that this method is virtual. (This "C++ syntax bug" is fixed in C# by requiring the use of the "override" keyword in this case - more proof if anyone needed it that missing out the "unnecessary virtual" is a really bad idea)

These are both clear examples where adding "unnecessary" code will make the code more readable and less prone to bugs.

2
ответ дан 3 December 2019 в 01:20
поделиться

Если пока игнорировать const , foo () возвращает значение. Вы можете выполнить

int x = foo();

и присвоить значение, возвращаемое foo () , переменной x почти так же, как вы можете сделать

int x = 42;

, чтобы присвоить значение 42 в переменную x.
Но вы не можете изменить 42 ... или значение, возвращаемое foo () . Заявление о том, что значение, возвращаемое из foo () , не может быть изменено путем применения ключевого слова const к типу foo () ничего не дает.

Значения не может быть const ( или restrict , или volatile ). Только объекты могут иметь квалификаторы типа.


В отличие от

const char *foo();

В этом случае foo () возвращает указатель на объект. Объект, на который указывает возвращаемое значение, может быть квалифицирован как const .

4
ответ дан 3 December 2019 в 01:20
поделиться

const int foo () сильно отличается от const char * foo () . const char * foo () возвращает массив (обычно строку), содержимое которого не может изменяться. Подумайте о разнице между:

 const char* a = "Hello World";

и

const int b = 1;

a по-прежнему является переменной и может быть назначен другим строкам, которые не могут измениться, тогда как b не является переменной. Таким образом,

const char* foo();
const char* a = "Hello World\n";
a = foo();

разрешен, но

const int bar();
const int b = 0;
b = bar();

не разрешен, даже с объявлением const для bar () .

3
ответ дан 3 December 2019 в 01:20
поделиться

Целое число возвращается копией . Это может быть копия константы, но когда она присваивается чему-то другому, это что-то в силу того факта, что оно было назначено, не может по определению быть константой.

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

3
ответ дан 3 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: