何时应该内联成员函数以及何时应该使用成员初始值设定项?
我的代码在下面..我想修改它,以便我可以在适当的时候使用一些内联和成员初始化器:
#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();
}
}
答案 0 :(得分:3)
经常调用的短成员函数是内联的良好候选者。为了使成员函数“无法使用”,您需要在头文件中定义它(在类定义本身中,或使用inline
关键字在类定义下面)。
您应该始终使用构造函数初始化列表来初始化成员数据。对于用户定义的类型,在某些情况下,这可能会产生显着的性能差异。您的构造函数应如下所示:
Book::Book() : nm(""), thck(0), wght(0) { }
Here非常好地解释了为什么要使用初始化列表。
答案 1 :(得分:1)
简短回答 - 不是从一开始。为标头中的类声明 clean interface ,并首先将所有实现细节放入.cpp
文件中。测量,分析并从那里开始。
对于初始化程序 - 使用始终。编译器无论如何都会为你做这件事,因此在构造函数体中分配数据成员是多余的(对于类类型成员来说可能很昂贵。)当你需要明确地做工作时,只有很少的情况,如成员变量依赖和低级C调用在构造函数体中。