Какие идиомы, заблуждения и ошибки, связанные с C ++, вы узнали из опыта? - PullRequest
27 голосов
/ 16 ноября 2008

Какие некоторые идиомы, заблуждения и ошибки, связанные с C ++, вы узнали из опыта?

Пример:

class A
{
  public: 
  char s[1024];
  char *p;

  A::A()
  {
    p = s;
  }

  void changeS() const
  {
    p[0] = 'a';
  }

};

Даже знаю, что changeS - это постоянная функция-член, она меняет значение объекта. Таким образом, функция-член const означает только то, что она будет обрабатывать все переменные как const, и это не значит, что она на самом деле будет поддерживать все члены const. (почему? Ключевое слово const в функции-члене рассматривает char * p; как char * const p; а не как const char * p;

Что означает, что p не может указывать на что-то еще. И не то, что вы не можете изменить данные р.

Ответы [ 16 ]

3 голосов
/ 16 ноября 2008

Если у вас есть класс, у которого нет семантики значений, убедитесь, что все следующие конструкции явно объявлены, чтобы избежать головной боли в будущем.

  • Конструктор по умолчанию
  • Конструктор копирования
  • Оператор присваивания

Во многих случаях вам нужно только объявить подмножество этих конструкций. Тем не менее, в некоторых случаях это может стать действительно сложным делом относительно того, какие нужны, а какие нет. Гораздо безопаснее объявить все 3 закрытыми и покончить с этим.

Также очень полезно добавить комментарий в начало, объясняющий, что это не класс, защищенный от копирования.

Это сэкономит ваше время в будущем.

0 голосов
/ 16 января 2013

Используйте boost::spirit::hold_any ( ссылка ) вместо boost::any для кода производительности (при удержании большого количества мелких объектов). Я видел большую разницу в их выступлениях.

0 голосов
/ 16 января 2013

Не попадитесь в ловушку использования std::noncopyable, если в этом нет необходимости. Да, это полезно во многих местах и ​​должно использоваться там.

Ловушка в том, что вы начинаете писать функцию clone() вместе с тем, что она становится не копируемой, которая реализует те же функции. Вместо этого вы также можете использовать explicit ( link ) для конструктора копирования, чтобы предотвратить случайное копирование (и сделать присвоение закрытым или удалить функцию в C ++ 0x). clone() необходим для унаследованных базовых классов.

0 голосов
/ 16 января 2013

Не предпочитайте использовать shared_ptr без необходимости. Предпочитаю использовать ссылки C ++ и unique_ptr. shared_ptr снижает производительность и делает код более сложным, чем он есть. Обычно это не проблема, за исключением необычной привлекательности shared_ptr и ее заразительной природы.

0 голосов
/ 10 марта 2009

Ничего такого, с чем я сталкивался при программировании, но друг хотел объяснить, почему код работает. Мне потребовалось время, чтобы понять это. Может быть, это очевидно для вас, ребята, но я не опытный программист.

#include <iostream>
using namespace std;

int& strangeFunction(int& x){return x;}


int main(){
        int a=0;
        strangeFunction(a) = 5;               //<------- I found this very confusing
        cout << a <<endl;
        return 0;
}
0 голосов
/ 17 ноября 2008

Я не могу сказать, что я опытный программист на C ++, но недавно я узнал, как сложно передавать массив массивов в качестве параметра функции. Старайтесь избегать этого любой ценой: (* ​​1001 *

Если вы знаете размер при компиляции, все просто. Даже если вы знаете одно из измерений во время компиляции. Если вы просто не знаете ... возможно, вы смотрите на что-то вроде этого

m[i*dim2+j]

Будучи я итератором для строк, dim2 число столбцов и j итератором для столбцов.

...