在类里面定义的函数会自动成为内联函数,所以在类里面定义的函数是没有必要加inline的。inline应该加在函
数定义的地方,而不是函数声明的地方(加在这个地方不起作用)。inline函数的定义应该放在头文件里面(可
以在类里面也可以在类外面,在类里面是不必加inline的,在类外面则要加inline)。
如果编译器觉得一个函数可以成为内联的话,会把这个函数的函数体放到符号表中(当然这个函数的类型也放到
了符号表)。在内联函数调用的地方,编译器会对函数的参数进行类型检查或进行可能的类型转换,然后把函数
体替换掉函数调用。
加上inline只是给编译器一个建议,至于能否成为内联,则由编译器来决定(如对一些比较复杂的函数,比如使
用了循环,则这样的函数即使加了inline也不会内联)。
书上的一个计时类:
class Timer
{
public:
Timer( )
{
Mark( );
}
~Timer( ) {}
void Mark( )
{
time( &t );
lflag = aflag = 0;
}
public:
const char * ascii( )
{
updateAscii();
return szAscii;
}
int difference( Timer* timer ) const
{
return difftime( t, timer->t );
}
private:
void updateLocal( )
{
if ( !lflag )
{
local = *localtime( &t );
lflag ++;
}
}
void updateAscii( )
{
if ( !aflag )
{
updateLocal();
strcpy( szAscii, asctime( &local ) );
aflag ++;
}
}
private:
time_t t;
tm local;
enum {enumSize = 126};
char szAscii[ enumSize ];
unsigned char lflag;
unsigned char aflag;
};
// 测试代码
void testTimer( )
{
Timer start;
for ( int nPos = 0; nPos < 20000; nPos ++ )
{
if ( nPos % 3 == 0 )
cout << nPos << " ";
}
cout << endl;
Timer end;
cout << start.ascii() << endl;
cout << end.ascii() << endl;
cout << end.difference( &start ) << "s" << endl;
}
预处理器很有用的几个地方:
#define TRACE(X, Y) X; cout << #X#Y << endl; // #X把X作为一个字符串,#X#Y把两个字符串连在一起
void testMacro( )
{
TRACE( int a = 2;, 你好 ); // 谨慎使用
cout << a << endl;
}
#define MacTry(X) char * X##_string; X##_string = 0 // ##把宏参和字符串连起来作为一个标识符
void bb( )
{
MacTry( one ); // char * one_string; one_string = 0
one_string = "abc";
cout << one_string << endl;
}