从c到c++<二>

  • 用于对与局部变量同名的全局变量进行访问
    下面通过程序来进行说明:

    运行看一下:
  • 用于表示类的成员,这将在关于类的一节中详细说明

 对于学过java的人来说,应该对于new运算符很容易理解,它实际上相当于c语言中的malloc函数,下面先看下定义:


下面看下程序:

答案是:不确定的内容,因为没有具体赋值,下面来运行验证下:

如果在定义时就想给它初始化可以这样写:

输出如下:

【注意】:这个new如果失败了则会抛出异常,而不会返回NULL指针,不需要进行NULL的判断;而C语言中的malloc如果申请失败了则会返回NULL,所以需要做NULL的判断。

 在C语言中如果用malloc在堆中申请的内存空间需要最后用free函数释放掉,而c++中对应的也需要释放,用的是delete,具体定义如下:

具体程序如下:

下面进一步的探讨new和delete运算符:

 对于malloc函数,它只会进行内存分配而不会调用构造函数,这是它们之间的区别,另外需要区分两个概念:operator new和new operator

对于上面这个操作实际上就叫作new operator,而它是由上面的两个步骤构成,其中包含operator new。

对于new,实际上有三种操作:

new operator  公配内存+调用构造函数
operator new  不分配内存+调查用构造函数
placement new  不分配内存+调用拷贝构造函数

 

 

 

【说明】:由于还没学到类,所以关于构造函数的调用还看不到,但是学过面向对象的都知道~~

照着new的理解,delete就类似。

下面用代码来实验一下:

编译运行:

 

结合代码来看,c++为了支持重载,对重载的函数进行了名字改编,所以编译器看到的函数名并非是fun,下面来具体说明下这点:

编译结果:

而如果在函数前面加上extern "C"关键字,则不会进行名字改编了,具体如下:

为了验证这点,再写一个同名的函数就能验证出来:

关于上面的代码,可以进行简写:

如果写得更加好的话,应该这样写:

如果将这个函数的声明放到头文件中,然后加上上面的判断,这样头文件既可以在C++中使用,也可以在C语言中使用了。

  • 函数声明或者定义的时候,可以给形参赋一些默认值。
  • 调用函数时,若没有给出实参,则按指定的默认值进行工作。
    下面用程序来说明下:

  • 函数没有声明时,在函数定义中指定形参的默认值。
  • 函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值
    具体代码如下:

    这时编译一下:

    所以就论证了上面这句话,实现是不允许再次给形参默认值了,如下:

  • 默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值。
    a、void func1(int a, double b=4.5, int c=3); //合法
    b、void func1(int a=1, double b, int c=3);  //不合法
  • 函数调用时,实参与形参按从左到右的顺序进行匹配。
  • 重载的函数中如果形参带有默认值时,可能产生二义性。

    而对于刚才我们编写用来说明函数定义和声明不能都给默认值的程序中,就有这个问题,程序如下:

    编译运行:

    这就是函数重载的二义性了,需要避免,这个程序要避免,则就需要去掉默认形参既可:
原文地址:https://www.cnblogs.com/webor2006/p/4842385.html