C++重载和extern C理解

来源:互联网 发布:js点赞心形动态效果 编辑:程序博客网 时间:2024/05/30 23:27

1、什么叫重载?

所谓重载一般指的函数重载overload,什么意思呢就是在一个C++项目中,存在多个函数名字一样的函数,但是他们的细微区别则是返回值,参数类型,参数个数,参数顺序不一样,而名字一样。这样的一些形同名字的函数在C++中就叫函数重载,也称为静多态。当然为了和多态理解区分混淆这里还是叫重载吧。

能解决什么问题?

重载的好处要做几个基本上一致的事情不需要写多个不同的函数,而是直接写一样的函数名只是参数不一样而已,比如print函数可以打印\int float string。只需要参数不同即可。这个时候编码的时候就可以很容易的调用某一类函数名实现不同的功能。至于函数的匹配会更具参数的形式进行严格匹配,如果计算机不能匹配则会报错导致编译不过。

2、怎么做到函数重载?和C有什么不一样?

在C中如果一个文件中定义几个相同函数名的函数则会导致编译不过,但是在C++中则可以。因为在C++中,编译器编译函数的时候会对函数进行倾轧(name mangling).意思就是将函数名压缩成类似 : 函数名_第一个参数_第二个参数_第三个参数一样。这样在文件中调用重载函数的时候也会根据传入参数的类型,顺序,个数等信息对调用函数进行倾轧。当然被调用函数在实现的时候会先被编译(如果是C++编译器也会对其进行倾轧)。这样调用文件中编译出来的重载的函数名和被调用函数定义出定义的重载明是匹配的。这样在函数链接的时候技能找到对应的重载函数,从而做到函数重载的目的。

3、进程在C++中看到的

extern "c" 

{

    void fund()

    {

     ......

    }

}

到底什么意思?因为C++是兼容C的,因此它需要兼容C的语法和C的库,比如兼容stdlib.h stdio.h.中的函数。而这些头文件在C++功能中也会用到,也就是会#include <stdio.h>之类的,因此如果不做任何事情的话这些函数在被C++文件函数调用的时候会被默认倾轧,也就是按照C++的方式编译函数名字。而这些函数的定义是在C库中是没有没有倾轧的,因此如果这样的话则C++文件函数中就找不到对应的C函数了。这样就做不到兼容了。因此在这个头文件中会增加一句话:#ifdef __CPlusPlusextern "C" { }的方式。这样就告诉编译这些头文件中的函数不进行倾轧,然后在C++文件函数中调用这些函数的因为包含了这个头文件因此这些函数就不进行倾轧,就会按照C的方式进行编译。这样才能正常的链接C库函数。

4、运算符重载

可以这样来理解,在C中定义了几本的的如+ - * /运算符。而这些运算符只能适用于几本的数据类型,如int,float这些。而在C++中,由于多了如类对象,结构体对象这些类型。因此在C++编码过程中需要简单的对这些对象进行如基本类型一样的运算。那么本身在C中是不支持这样使用的,但在C++中则可以这样使用。再者如某个运算符重载其实就是相当于定义一个处理这个重载功能的函数一样。只不过在C++中会用关键字operator来表明这是一个运算法重载而不是一个函数(其实你完全可以理解他就是一个函数,只是函数名用的如+号来表示)。如下例子。

#include <iostream>

#include <iomanip>

#include <chrono>

#include <thread>

#include <stdio.h>

using namespacestd;


struct Complex

{

    int real;

    int image;

};


//定义一个+号运算法重载,其实这里+号你完全可以理解一个函数名如add一样。

struct Complexoperator+(structComplex a, struct Complex b)

{

    structComplex c;

    c.real = a.real+b.real;

    c.image = a.image+b.image;

    return c;

}


int main()

{

    structComplex a={1,2}, b={2,3};

    structComplex c = a + b;//这里就使用了+号运算法重载

    cout<<"c= {"<<c.real<<","<<c.image<<"}"<<endl;

    

}