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

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;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值