快速业务通道

C和C++语言学习总结(二)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
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"来解决这个问题.例如:

extern "C"
{
void foo(int x, int y);
… // 其它函数
}
或者写成
extern "C"
{
#include "myheader.h"
… // 其它C 头文件
}
这就告诉C++编译译器,函数foo 是个C 连接,应该到库中找名字_foo 而不是找_foo_int_int.C++编译器开发商已经对C 标准库的头文件作了extern"C"处理,所以我们可以用#include 直接引用这些头文件.

函数参数的缺省值问题

正确方法:

void Foo(int x=0, int y=0); // 正确,缺省值出现在函数的声明中
void Foo(int x,int y)
{
...
}

错误方法:

void Foo(int x=0, int y=0) // 错误,缺省值出现在函数的定义体中
{
...
}

正确方法:

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 放在函数声明前面不起任何作用.

正确使用方法:

void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{

}

错误使用方法:

inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
&

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号