开发者

inline and member initializers

When should I inline a member function and when should I use member initializers?

My code is below.. I would like to modify it so I could make use some inline when appropriate and member initializers:

#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::addS开发者_StackOverflow中文版helf(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();
 }
}


Short member functions that are called frequently are good candidates for inlining. In order to make the member function "inlinable," you need to define it in the header file (either in the class definition itself, or below the class definition using the inline keyword).

You should always use constructor initializer lists to initialize member data. For user-defined types, this can make a substantial performance difference in some cases. Your constructor should look like this:

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

Here is a pretty good explanation of why to use initializer lists.


Short answer - not from the beginning. Declare clean interface for the class in the header, and put all implementation details into a .cpp file first. Measure, profile, and go from there.

As for initializers - use them always. Compiler does it for you anyway, so assigning data members in the constructor body is redundant (and might be expensive with class-type members.) There only few situations like member variable dependency and lower-level C calls when you need to explicitly do work in the constructor body.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜