内联函数

在类里面定义的函数会自动成为内联函数,所以在类里面定义的函数是没有必要加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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值