C++高级特性

来源:互联网 发布:a* b*算法 编辑:程序博客网 时间:2024/06/05 07:49

C++函数区别于C函数主要有四个方面的高级特性:

一、重载(overloaded)、内联(inline)、const和virtual四种新机制。


重载函数条件:1.函数名相同,2,同一个作用域(即同时为某个类的成员函数)3.参数个数或类型不同

注意:1.函数仅返回类型不同这不是函数重载,编译会报错

             2.相同函数名作用于不同而非函数重载 例如:

        void Print(…); // 全局函数
  class A
  {…
  void Print(…); // 成员函数
  } 不论两个Print函数的参数是否不同,如果类的某个成员函数要调用全局函数Print,为了与成员函数Print区别,全局函数被调用时应加‘::’标志。如
  ::Print(…); // 表示Print是全局函数而非成员函数

1.编译器怎样区别重载函数?

编译器在编译时根据重载函数参数的类型以及个数不同做个标示以示区别。

2.重载与重写即覆盖(override)的区别:覆盖应用在继承关系的父类与子类之间,覆盖的函数必须由virtual 关键字标示 例如:

    函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖。
  #include
  class Base
  { public:
  void f(int x){ cout << "Base::f(int) " << x << endl; }
  void f(float x){ cout << "Base::f(float) " << x << endl; }
  virtual void g(void){ cout << "Base::g(void)" << endl;}
  }; class Derived : public Base
  { public:
  virtual void g(void){ cout << "Derived::g(void)" << endl;}
  }; void main(void)
  { Derived d;
  Base *pb = &d;
  pb->f(42); // Base::f(int) 42
  pb->f(3.14f); // Base::f(float) 3.14
  pb->g(); // Derived::g(void)
  } 


二.内敛与宏的区别:

宏由预处理器对宏进行替代,而内联函数通过编译器控制来实现。两者都能提高程序运行效率


1.  程序在编译时,编译器会将宏引用的地方替换成定义的语句块,即将引用的代码展开:

宏有两个缺点:1.红不能访问私有属性

                            2.宏容易产生函数二义性,例如:

例如下面这个宏:

   #define MAX(a, b) a>b?a:b

当我们这样使用宏时,没有什么问题: MAX( num1, num2 ); 因为宏展开后变成 num1>num2?num1:num2 ;。 但是,如果是这样调用的, MAX( 17+32, 25+21); 呢,编译时出现错误,原因是,宏展开后变成: 17+32>25+21?17+32:25+21 , Woh ,这是什么啊?

所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。

   #define MAX( (a), (b) ) (a)>(b)?(a)b)

即使是这样,也不这个宏也还是有 Bug ,因为如果我这样调用 MAX(i++,j++); , 经过这个宏以后, i 和 j 都被累加了两次,这绝不是我们想要的。所以,在宏的使用上还是要谨慎考虑,因为宏展开是的结果是很难让人预料的。而且虽然,宏的执行很快(因为没有函数调用的开销),但宏会让源代码澎涨,使目标文件尺寸变大,(如:一个 50 行的宏,程序中有 1000 个地方用到,宏展开后会很不得了),相反不能让程序执行得更快(因为执行文件变大,运行时系统换页频繁)。


2.内联函数必须和函数体一起申明才有效

像这样的申明 Inline Tablefunction(int I) 是没有效果的,编译器只是把函数作为普通的函 数申明,我们必须定义函数体。

 

Inline tablefunction(int I) {return I*I};

 

  这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调 。但是执行速度确比一般函数的执行速度要快。 我们也可以将定义在类的外部的函数定义为内联函数 ,比如:

 

Class TableClass{

  Private:

   Int I,j;

  Public:

   Int add() { return I+j;};

   Inline int dec() { return I-j;}

   Int GetNum();

}

inline int tableclass::GetNum(){

return I;

}

 

  上面申明的三个函数都是内联函数。在 C++ 中,在类的内部定义了函数体的 函数,被默认为是内联函数。而不管你是否有 inline 关键字。 内联函数在 C++ 类中,应用最广的,应该是用来定义存取函数。我们定义的 类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我 们类成员的数据了。   对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把 这些读写成员函数定义成内联函数的话,将会获得比较好的效率。

 

Class sample{

  Private:

   Int nTest;

  Public:

   Int readtest(){ return nTest;}

  Void settest(int I) {nTest=I;}

}

 

  当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了 ,如 果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式 调用函数。这样,内联函数就和普通函数执行效率一样了。


                                                                                                                                                                                                                                                              注:写此博文有参考其他博文


原创粉丝点击