35、C++对C语言的非面向对象的扩充

来源:互联网 发布:网络卡盟 编辑:程序博客网 时间:2024/06/03 17:44

C++对C语言的非面向对象的扩充主要包括
  --数据类型的扩充,例如引用类型、无名联合等;
  --运算符的扩充,例如范围运算符和自定义运算符等;
  --函数的扩充,例如内联函数、重载函数、参数为默认值的函数、参数个数不确定的函数等。
  1、引用类型
  引用类型其实就是给某个变量起一个别名,它意味着声明的变量只是其他变量的别名,而不是一个真正的独立变量。当用到引用变量时,使用的将是被引用的变量。引用类型变量的声明形式如下:
  类型说明 & 引用变量=被引用变量;
例1:

// 引用数据类型#include<iostream>using namespace std;void main(){   int y=0;   int &x=y; //x是y的别名   y=10;   x+=1;  //相当于y=y+1;   cout<<y<<endl;}

结果为:11
 
例2:

// 引用数据类型#include<iostream>using namespace std;void Swap(int &a, int b) // a 是x的别名,其实还是x{   int t;   t=a;   a=b;   b=t;}void main(){  int x=1,y=2;  Swap(x,y);  cout<<x<<endl;  cout<<y<<endl;}

这里写图片描述
 
  
  2、无名公用类型
  C++扩充的联合体类型,支持一种不需要定义变量就可以直接使用的共用体,而且这种共用体不用初始化,这种共用体被叫做无名共用体。定义格式如下:
  union {成员变量;}
  无名公用类型的成员变量也不用再使用“.”运算符和“->”运算来获取,可直接访问,它的成员变量之间仍然是共享存储空间。
  
例3:

//无名共用体#include<iostream>using namespace std;void main(){    union {       int x;       char y;      };    y=0;    x=51;    // 3的ASCII码值是51    cout<<"\n\''"<<x<<","<<y<<"\''"<<endl;    y='C';   // C的ASCII码值是67    cout<<"\n\''"<<x<<","<<y<<"\''"<<endl;}

这里写图片描述

   
   3、范围运算符
  在 C 语言中,如果一个全局变量与一个局部变量的名字是相同的,那么在局域变量的有效范围内,是无法使用全局变量的。C++提供了一个范围运算符::,用于标志出一个全局变量或者对象。
  
例4:使用范围运算符来访问被局域变量隐藏的全局变量

//使用范围运算符来访问被局域变量隐藏的全局变量#include<iostream>using namespace std;char c;char f(){    char c;    c='A';    ::c='B';    return c; }void main(){    char ch;    ch=f();    cout<<"local c in f is "<<ch<<endl;    cout<<"global c is "<<c<<endl;    cout<<"global c is "<<::c<<endl;}

这里写图片描述
   
   4、内联函数
  所谓内联函数,就是当函数被调用时,函数的目标代码被插入到程序中,这样的函数就被称为内联函数。
  内联函数与其它函数的区别主要在执行过程中机器内部的处理。在使用其它函数时,往往要进行堆栈操作,而如果使用内联函数,它实际上是将代码嵌入到函数调用的位置,减少了堆栈等操作。使用内联函数,主要是为了提高效率。控制结构不能出现在内联函数中。
  内联函数通过修饰符inline来进行说明。
例5:

//使用内联函数#include<iostream>using namespace std;char c;inline char f(){    char c;    c='A';    ::c='B';    return c; }void main(){    char ch;    ch=f();    cout<<"local c in f is "<<ch<<endl;    cout<<"global c is "<<c<<endl;    cout<<"global c is "<<::c<<endl;}

   定义的内联函数只是在编译成可执行文件后,其可执行文件代码与使用非内联的代码略有不同,从表面上看,其运行结果无不同之处。
  
  5、参数带默认值的函数
  C++语言允许函数的参数带有默认值。定义形式如下:
  函数类型 函数名(参数类型 参数名=默认值)
  例如
  

void print(char c='\n'){  printf("%c",c);}

例6:多个参数条件下使用默认值的情况

// 多个参数条件下使用默认值的情况#include<iostream>using namespace std;#include<math.h>int Sum(int x=1,int y=10){  if((x<=0)||(y<=0)||(x>y))        return -1;  int i,temp=0;  for(i=x;i<=y;i++)  {    temp+=i;  }  return temp;}void main(){    int result;    result=Sum(1,100);    cout<<"Sum(1,100)= "<<result<<endl;    result=Sum(1);    cout<<"Sum(1)= "<<result<<endl;    result=Sum( );    cout<<"Sum( )= "<<result<<endl;}

这里写图片描述

  6、参数个数不确定的函数
  定义形式如下:
  函数类型 函数名(参数,…)
  注意:在定义参数个数不确定的函数时,括号中一定要包括一个省略号。
  当调用这样的函数时,传递给函数后面的几个参数的类型、个数都是不确定的,这经常会产生一些矛盾,所以,只是提供了这样的机制,并不推荐使用这样的函数。
  7、函数重载
  在C 语言中,每个函数都有一个唯一的名字,不同的函数,名字一定不同。即使是功能完全相同,也必须根据参数类型的不同给出不同的函数。例如: 

void printA(char c);void printB(int i);void printC(char *s);void printD(float f);

  多个函数具有相同的函数名的情况被称为是函数的重载。通过函数的重载,用一个名字就可以处理不同的任务。例如,在C++中,可将上面定义的4个不同名字的函数如下定义:

void print(char c);void print(int i);void print(char *s);void print(float f);

   8、内存管理
  变量具有自身的存储空间,在传统的C语言中,可以使用一些函数来对变量占用的空间进行动态管理。在C++中,则是通过new 和delete操作来进行内存的动态管理。new 操作是新建一个对象并进行内存的分配,delete则是销毁一个对象,回收该对象所占用的内存。
  使用new操作时,通常情况下先声明一个指针变量,采用下列形式:
  指针变量 = new 变量类型
  例如:
  int *p;
  p= new int;
  上面代码先声明了一个整型指针变量,然后将指针p 指向一个新建的存放整型数据的存储空间。
  
例7:动态管理变量内存

//动态管理变量内存#include<iostream>using namespace std;void main(){  //定义整型指针变量并动态分配内存    int *pint= new int;    *pint = 50;    cout<<*pint<<endl;    delete pint;}

这里写图片描述

例8:对数组存储空间进行动态管理

//对数组存储空间进行动态管理#include<iostream>using namespace std;void main(){  //定义整型指针变量并动态分配内存    int *pint;            //定义整型指针    pint = new int[20];   //动态分配整型数组的空间    int iCount;    for(iCount=0;iCount<20;iCount++)    {       *(pint+iCount)=iCount;  //为数组元素赋值        }    for(iCount=19;iCount>=0;iCount--)    {        cout<<pint[iCount]<<endl;    }    delete [] pint;}

这里写图片描述

0 0