内联和成员初始化程序

时间:2010-03-14 19:10:54

标签: c++ c visual-c++

何时应该内联成员函数以及何时应该使用成员初始值设定项?

我的代码在下面..我想修改它,以便我可以在适当的时候使用一些内联和成员初始化器:

#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 个答案:

答案 0 :(得分:3)

经常调用的短成员函数是内联的良好候选者。为了使成员函数“无法使用”,您需要在头文件中定义它(在类定义本身中,或使用inline关键字在类定义下面)。

您应该始终使用构造函数初始化列表来初始化成员数据。对于用户定义的类型,在某些情况下,这可能会产生显着的性能差异。您的构造函数应如下所示:

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

Here非常好地解释了为什么要使用初始化列表。

答案 1 :(得分:1)

简短回答 - 不是从一开始。为标头中的类声明 clean interface ,并首先将所有实现细节放入.cpp文件中。测量,分析并从那里开始。

对于初始化程序 - 使用始终。编译器无论如何都会为你做这件事,因此在构造函数体中分配数据成员是多余的(对于类类型成员来说可能很昂贵。)当你需要明确地做工作时,只有很少的情况,如成员变量依赖和低级C调用在构造函数体中。