встроенные и членские инициализаторы - PullRequest
1 голос
/ 14 марта 2010

Когда я должен встроить функцию-член и когда я должен использовать инициализаторы членов?

Мой код приведен ниже. Я хотел бы изменить его, чтобы при необходимости использовать некоторые встроенные элементы и инициализаторы:

#include "Books.h"

Book::Book(){
  nm = (char*)"";
  thck = 0;
  wght = 0;
}

Book::Book(const char *name, int thickness, int weight){
  nm =  strdup(name);
  thck = thickness;
  wght = weight;
}

Book::~Book(){

}

const char* Book::name(){
 return nm;
}

int Book::thickness(){
 return thck;
}

int Book::weight(){
 return wght;
}

//
// Prints information about the book using this format:
// "%s (%d mm, %d dg)\n"
//
void Book::print(){
  printf("%s (%d mm, %d dg)\n", nm, thck, wght);
}


Bookcase::Bookcase(int id){
 my_id = id;
 no_shelf = 0;
}

int Bookcase::id(){
 return my_id;
}

Bookcase::~Bookcase(){
  for (int i = 0; i < no_shelf; i++)
    delete my_shelf[i];
}

bool Bookcase::addShelf(int width, int capacity){
  if(no_shelf == 10)
    return false;
  else{
    my_shelf[no_shelf] = new Shelf(width, capacity);
    no_shelf++;
    return true;
  }
}

bool Bookcase::add(Book *bp){
 int index = -1;
 int temp_space = -1;
 for (int i = 0; i < no_shelf; i++){
    if (bp->weight() + my_shelf[i]->curCapacity() <= my_shelf[i]->capacity()){
       if (bp->thickness() + my_shelf[i]->curWidth() <= my_shelf[i]->width() && temp_space < (my_shelf[i]->width() - my_shelf[i]->curWidth())){
        temp_space = (my_shelf[i]->width()- my_shelf[i]->curWidth());
        index = i;
          }
    }
 }

 if (index != -1){
    my_shelf[index]->add(bp);
    return true;
 }else
    return false;

}

void Bookcase::print(){
 printf("Bookcase #%d\n", my_id);
 for (int i = 0; i < no_shelf; i++){
    printf("--- Shelf (%d mm, %d dg) ---\n", my_shelf[i]->width(), my_shelf[i]->capacity());
    my_shelf[i]->print();
 }
}

Ответы [ 2 ]

3 голосов
/ 14 марта 2010

Короткие функции-члены, которые часто вызываются, являются хорошими кандидатами для встраивания. Чтобы сделать функцию-член «встроенной», необходимо определить ее в заголовочном файле (либо в самом определении класса, либо ниже определения класса с помощью ключевого слова inline).

Вы должны всегда использовать списки инициализатора конструктора для инициализации данных элемента. Для пользовательских типов в некоторых случаях это может существенно повлиять на производительность. Ваш конструктор должен выглядеть так:

Book::Book() : nm(""), thck(0), wght(0) { }

Здесь - довольно хорошее объяснение того, почему использовать списки инициализаторов.

1 голос
/ 14 марта 2010

Краткий ответ - не с самого начала. Объявите чистый интерфейс для класса в заголовке и поместите все детали реализации в файл .cpp. Измерить, профиль, и идти оттуда.

Что касается инициализаторов - используйте их всегда . В любом случае компилятор сделает это за вас, поэтому назначение членов данных в теле конструктора является избыточным (и может быть дорогостоящим для членов типа класса). Существует только несколько ситуаций, таких как зависимость от переменных-членов и вызовы C более низкого уровня, когда вам нужно явно выполнить работу в теле конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...