C和C++语言学习总结(二)
lt; < "Base::h(float) " < < x < < endl;} void k(float x) { cout < < "Base::k(float) " < < x < < endl;} }; class Derived : public Base { public: virtual void g(void) { cout < < "Derived::g(void)" < < endl;} void h(int x) { cout < < "Derived::h(int) " < < x < < endl; } void k(float x) { cout < < "Derived::k(float) " < < x < < endl;} }; void main(void) { Derived d; Base*pb = &d; Derived *pd = &d; pb->f(42); // Base::f(int) 42 //重载 pb->f(3.14f); // Base::f(float) 3.14 //重载 pb->g(); // Derived::g(void) //覆盖 pd->g(); // Derived::g(void) //覆盖 pb->h(3.14f) // Base::h(float) 3.14 //隐藏 pd->h(3.14f) // Derived::h(int) 3 //隐藏 pb->k(3.14f) // Base::k(float) 3.14 //隐藏 pd->k(3.14f) // Derived::k(float) 3.14 //隐藏 } extern问题 如果C++程序要调用已经被编译后的C 函数,该怎么办? 假设某个C 函数的声明如下: void foo(int x, int y); 该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接.由于编译后的名字不同,C++程序不能直接调用C 函数.C++提供了一个C 连接交换指定符号extern"C"来解决这个问题.例如:
函数参数的缺省值问题 正确方法:
错误方法:
正确方法: void Foo(int x, int y=0, int z=0); 错误方法: void Foo(int x=0, int y, int z=0); 宏代码与内联函数区别 语言支持关系: C 宏代码 C++ 宏代码 内联函数 宏代码本身不是函数,但使用起来象函数.预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return 等过程,从而提高了速度.使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应. 对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型).如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里.在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样).如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销.这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换.假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的. 内联函数使用方法: 关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用. 正确使用方法:
错误使用方法:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |