2010-03-14 42 views
1

何时应该内联一个成员函数,什么时候应该使用成员初始值设定项?内联和成员初始值设定项

我的代码如下..我想修改它,所以我可以利用一些内嵌在适当的时候和成员初始化:

#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(); 
} 
} 
+1

'strdup()'在一个C++类中?当然你会开玩笑。 (你忘了'免费()') – 2010-03-14 19:15:42

回答

3

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

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

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

Here就是为什么要使用初始化列表一个很好的解释。

1

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

至于初始化程序 - 使用它们总是。编译器无论如何都会为你做这件事,所以在构造函数体中分配数据成员是多余的(对于类类型成员可能会很昂贵)。当需要显式地完成工作时,只有少数情况会出现成员变量依赖和较低级别的C调用在构造函数体中。

+0

“编译器为你做了它......”小心解释一下吗? – 2010-03-14 19:40:11

+0

@STingRaySC:编译器在构造函数的主体之前插入代码,以默认方式初始化所有基类(为了在class X之后出现)和成员变量(为了声明顺序)。相反的情况发生在*析构函数的主体之后 - 编译器插入代码来调用成员的析构函数,顺序相反,然后是基本析构函数。 – 2010-03-14 21:03:11

+0

只有用户定义类型的成员变量是默认初始化的。这正是使构造函数体中的赋值相对于初始化器列表中的初始化效率降低的原因。对于内置类型的成员数据,成员不是由编译器初始化的,因此在构造函数体中为它们分配* not *冗余。从技术上讲,即使对于UDT,没有任何东西是多余的,因为它的默认构造函数将被调用,后面是构造函数体中的赋值运算符。 – 2010-03-14 22:04:19

相关问题