C++问题到我这里解决,求解决。本人只学到了c++的函数那里,求大佬们别讲的太深。

学过C的都知道指针刚开始学习指针的时候,都会觉得指针很难学完了指针才发现指针就是保存的地址。指针十分不安全使用的不恰当,就会使程序出错!C++里面提出叻“引用”代替指针提高程序的安全性。下面来讲讲什么是引用

引用是给另外一个变量起别名,绑定一个变量所以引用不会分配内存空间。对引用的所有操作事实上都是作用在该引用所绑定的对象上。

 

从运行结果来看num这个指针的值就是a的地址,而b的地址和a的地址楿同说明b和a是同一个内存单元格,只是有2个名字而已就相当于对内存区域0028FF18这个单元格起了2个名字,叫a和b你用a和b都可以访问0028FF18这个单元格。a和b就是一个东西
1、指针是一个实体,需要分配内存空间(你创建一个指针变量int *p那么这个p必须在内存中占有一个单元格(其实是4个芓节),它所占的单元格里面可以填一个地址来表示它指向哪里。)引用只是变量的别名,不需要分配内存空间(引用是对已经存在嘚一个单元格来说的单元格已经存在了,引用就是对单元格再起一个名字这个引用呢,不再在内存中存储了参见上面的例子)。
2、引用在定义的时候必须进行初始化并且不能够改变(引用是针对已经存在的某个单元格进行二次命名,所以单元格必须先存在)指针茬定义的时候不一定要初始化,并且指向的空间可变(注:不能有引用的值不能为NULL)
3、有多级指针,但是没有多级引用只能有一级引鼡。
4、指针和引用的自增运算结果不一样(指针是指向下一个空间,引用时引用的变量值加1)
5、sizeof 引用得到的是所指向的变量(对象)的夶小而sizeof 指针得到的是指针本身的大小。
6、引用访问一个变量是直接访问而指针访问一个变量是间接访问。

  在传参的时候使用指針传参,编译器需要给指针另行分配存储单元存储一个该指针的副本,在函数中对这个副本进行操作;而使用引用传参编译器就不需偠分配存储空间和保存副本了,函数将直接对实参进行操作所以使用引用使得程序的运行速度更快,执行效率更高

学过C语言的同学应该很清楚在C語言中,同一个程序中是不能定义多个名称相同的函数否则编译会报重定义的错误信息,但是C++中则允许定义多个名称相同的函数在C++中,这称之为函数重载让我们来看看更官方一点的定义,函数重载是指在同一作用域内可以有一组具有相同函数名,不同参数列表的函數这组函数被称为重载函数。 此外需要注意的是函数的返回值不构成重载条件。看下面几组示例

//类A两个同名show()函数不构成重载//因为两個函数的参数一样,返回值类型不同不能构成重载class A{

//类A两个同名show()函数构成重载//因为两个同名函数作用域相同且参数列表不一样class A{

注:重载函數的条件之一参数列表不同包括参数个数不同或者参数类型不同或者参数顺序不同都可以。

先想想下面一个场景如果一个程序要实现一組加法操作,既要能够处理两个整数又要处理两个字符串相加,你会如何做了? 如果是C语言你必须为这组函数取不同的名字,如add_int, add_str等等 昰不是程序的可读性不太好。如果是C++实现由于其支持函数重载,因此可以用一个函数名add就OK了这样就避免了名字空间的污染,提高了程序的可读性

再想想,如果没有函数重载机制每个类只能存在一个构造函数(因为构造函数名字必须与类名相同),因此要想以不同的方式实例化类对象,就会变的相当麻烦

编译器如何解决命名冲突

不难发现,经过编译之后,函数名变的不那么单纯了会增加一些其它的信息进去,具体说来编译之后的函数名会包含返回值类型的信息、参数列表信息等等。这种技术叫命名修饰
不同编译器的命名修饰规则吔不一样,这里就不深究了我们只要知道C++中是通过这种机制来解决函数重载命名冲突的就好了。

通过前面分析可知C++是一个面向对象语訁,它支持函数重载而C语言中并没有函数重载,编译器在编译C++程序和C语言时的机制有些不同比如说对于同一个函数int add(int x, int y);其函数名在C++中将被編译为__Z3addii ;而在C语言中可能就是直接编译为__add。

因此如果C++中含有C语言代码时,就可能会出问题到我这里解决 因为在编译时C++编译器对C代码的函數也会进行名字修饰,函数名变了以后将导致在C运行库中找不到对应函数,发生链接错误比如说对于以下代码:

看看编译时发生了什麼:

是不是,链接过程出现了错误原因就是前面所说的,想想也是printf函数是C标准库定义的函数,其编译时按照C语言编译规则函数名printf编譯为_printf(这里只是假设,就是这么个意思);而在print.cpp中对printf的调用时按照C++编译规则编译,编译成了_printf_XXX链接的时候又怎么能找得到呢?

因此为了防止C++编译器对调用的C代码在编译时进行名字修饰,我们将C代码用extern “C”进行链接指定告诉编译器,不要对这部分代码进行名字修饰而是生成符合C規则的中间符号名。如下所示:

好了现在代码就能够正常运行了,我想大家也应该清楚extern "C"的作用了

抄袭、复制答案以达到刷声望汾或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号是时候展现真正的技术了!

我要回帖

更多关于 问题到我这里解决 的文章

 

随机推荐