zoukankan      html  css  js  c++  java
  • 2. C++语言面向过程编程的特点

    一、使用函数重载

    函数重载产生多态性的例子

    #include < iostream >
    using namespace std;
    int max( int, int) ;  //声明2个整型参数的函数原型
    int max(int, int, int) ;   //声明3个整型参数的函数原型
    void main()
    { cout <<max(35, 25) << "" <<max(25,39,35) <<endl; }
    int max (int ml, int m2)      //定义2个整型参数的函数
    { return ( ml > m2 ) ? ml :m2;}
    int max(int ml, int m2, int m3)     //定义3个整型参数的函数
    {
     int t = max( ml ,m2);
     return max(t,m3);
    }

    程序运行结果

    35,39

    C++允许为同一个函数定义几个版本,从而使一个函数名具有多种功能,这称为函数重载。只要分别为不同参数的max编制相应的函数体,就可以实现各自的功能。

    二、新的基本数据类型及其注意事项

    1、void是无类型标识符,只能声明函数的返回值类型,不能声明变量。

    2、C++比C多了bool(布尔)型。bool只有一个字节,bool取值false和true,是0和1的区别。

    3、C++只限定int和short至少要有16位,而long至少32位,short不得长于int,int不能长于long,VC++6.0规定int使用4字节,这与C使用2字节不同。

    4、C++中的常量

     5、C++与C一样,也使用转义序列。如:''表示ASCII码值为零的空字符(NULL),'101'表示字符A。

    三、动态分配内存

    使用new和delete举例

    #include < iostream >
    using namespace std;
    void main( ) {
      double * p ;           //声明double型指针
      p = new double[3];       //分配3个double型数据的存储空间
      for(int i = 0; i <3; i ++ )    //定义对象i的初值为0
       cin >> * ( p + i);        //将输入数据存入指定地址
      for( i =0; i <3; i ++ )
       cout << * (p + i) << " "    //将地址里的内容输出
      delete p;            //释放空间
      }

    说明:

    (1)C++为结构动态分配内存一般格式为:

    指针名=new 结构名 //分配

    delete 指针名; //当不再使用这个空间时,必须使用delete 释放空间。

    (2)C必须在可执行语句之前集中声明变量,而C++可以在使用对象时再声明或定义

    四、引用

    引用的例子

    #include < iostream >
    using namespace std;
    void main() {
    int x = 56 ;    //定义并初始化x
    int& a =x;    //声明a是x的引用,a和x的地址相同,a是x的别名
    int& r = a;    //声明r是a的引用,r和a的地址相同,即和x的地址也相同
    cout << " x = " << x << " , &x = " << &x << " , a = " << a << ",&a = " << &a
      << " , r = " << r << " ,&r = " << &r << endl ;
    r = 25;               //改变r,则a和x都同步变化
    cout << " x = " << x << " , &x = " << &x << ",a = " << a << ",&a = " << &a
      <<",r = " < r < ",&r = " << &r << endl ;
    }

    程序输出结果

    x=56, &x =0012FF7C, a=56, &a=0012FF7C, r=56, &r=0012FF7C 
    x=25, &x=0012FF7C, a=25,&a=0012FF7C,r = 25,&r = 0012FF7C

    说明:

    1)引用:简单的说就是为现有的对象起个别名,别名的地址与引用对象的地址是一样的。

    引用的声明方式为: 数据类型 & 别名=对象名

    注意:① 对象在引用前必须先初始化;

       ② 声明中符号"&"的位置无关紧要。

    int& a=x; int & a=x; int &a=x; 等效。

    2)所谓"引用",就是将一个新标识符和一块已经存在的存储区域相关联。因此,使用引用时没有分配新的存储区域,它本身不是新的数据类型。可以通过修改引用来修改原对象。

    3)引用通常用于函数的参数表中,因为使用引用作为函数参数不产生临时对象,可提高程序执行效率和安全性。

    4)引用也常用于作为函数的返回值,因为引用作为函数返回值可用于赋值运算符的左边。

    5)引用实际上就是变量的别名,使用引用就如同直接使用变量一样,引用与变量名在使用的形式上完全一样,引用只是作为一种标识对象的手段。

    但要注意

    ① 可以声明指向变量或引用的指针

    如:int *p=&x; √

    int &a=x; int * p=&a;√;

    ② 可以声明指针对指针的引用(为变量的指针起一个别名)

    如:int * & p2=p1; √(式中p1、p2是指针, * 声明p2是指针,&声明p2是p1的引用);

    ③ 不能声明指针对变量的引用(不能为变量起一个指针作为它的别名)

    如:int * &P=&x; × ;

    ④ 不能声明引用的引用

    如:int & & r=x; ×;

    ⑤ 不能直接声明对数组的引用, 但可以通过typedef来间接的建立对数组的引用。

    间接引用数组

    #include < iostream >
    using namespace std;
    typedef double array[ 10];
    void main( ) {
      array a = {12, 345678, 909876, 856443} ;
      array &b = a ;
      a[2] =100;               //操作数组a
      for(int i=0; i<10; i++)        //数组b与数组a同步变化
        cout << b [ i ] << " " ;
    }

    程序输出:

    12 34 100 78 90 98 76 85 64 43

    五、对指针使用const限定符

    1、变量的指针、指向变量的指针变量、指针变量指向的变量

    如:int a;

    int *p=&a;

    *p=2;

    P是变量a的指针,存放变量a所在的内存地址,则*p代表指针变量p指向的变量,也就是变量a,且下面等式成立:

    p==&a *p==*&a==a &*p==&a (*p)++==a++

    2、左值和右值

    左值是指某个对象的表达式,必须是可变的。左值表达式在赋值语句中即可作为左操作数,也可作为右操作数,如:x=56;和y=x; ,而右值56就只能作为右操作数,不能作为左操作数。

    3、指向常量的指针

    const int *p

    *p是常量,不能进行"*p="的操作,所以称为指向常量的指针

    如:

    const int y=58;

    const int *p=&y; //p是指向常量y的指针,不能作为左值

    int x=45;

    const int *p=&x; //能通过左值x间接改变*p的值

    4、常量指针

    int x=5;

    int * const p=&x;                      //P是常量指针,即是常量地址,必须初始化,此后p的值不能改变

    *p=56                                         // p所指的变量x的值改变为56。

    5、指向常量的常量指针

    int x=2;

    const int * const p=&x;

    //*p和p都是常量,都不能作为左值,p必须初始化

    六、泛型算法应用于普通数组

    1、数组不能作为整体输出,C++引入STL库提供的泛型算法,大大简化数组操作。所谓泛型算法,就是提供的操作与元素的类型无关。

    2、假设一维数组a和b的长度均为Len,数据类型为Type,则对数组内容的相关操作和语句如下:

    (1)数组内容反转:

    reverse(a,a+Len);      //数组元素反转排列

    (2)复制数组内容:

    copy(a,a+Len,b);     //将数组a的内容原样复制到数组b

    reverse_copya,a+Len,b); //逆向复制数组a中内容到数组b

    (3)数组升幂排序:

    sort (a,a+Len);      //默认排序方式是升幂

    (4)数组降幂排序:

    sort (b,b+Len,greater<Type>()); //数组降幂排序

    (5)检索查找数组内容:

    find(a,a+Len,value); //查找数组a中是否存在值为value的元素

    find函数返回的是位置指针,一般使用判别语句输出查找的内容,如:

    Type *x=find(a,a+Len,value); //x是类型为type的指针

    if(x==a+Len) cout<<"没有值为value的数组元素";

    else cout<<"有值为value的数组元素";

    (6)输出数组的内容

    ①将数组内容按正向送往屏幕:

    copya,a+Len,ostream_iterator<Type>(cout,"字符串"));

    输出方式是将每个元素与"字符串"的内容组合在一起连续输出。

    如果使用空格" "或换行符" ",可以按格式输出。

    copy(a,a+Len,ostream_iterator<Type>(cout," "));

       //每个输出元素后面输出一个空格

    copy(a,a+Len,ostream_iterator<Type>(cout," "));

       //每个输出元素之后,换新行

    ②将数组内容按逆向方式送往屏幕:

    reverse_copya,a+Len,ostream_iterator<Type>(cout,"字符串"));

    总结

    3、对数组内容进行升幂、输出、反转和复制等操作需要包含头文件<algorithm>;对数组内容进行降幂和检索等操作需要包含头文件<functional>。

    演示数组升幂排序、复制、逆向和输出等操作

    #include < iostream >
    #include < algorithm >                        //头文件
    using namespace std;
    void main( ){
      double a[ ] = {1. 14. 4, 3. 32. 2},b[4];
      copy( a,a +4, ostream_iterator < double > ( cout," "));       //正向输出数组a,以空格隔开
      cout<< endl ;
      reverse _ copy( a,a +4, ostream _ iterator < double > (cout," ")); //逆向输出数组a,以空格隔开
      cout<< endl ;
      copy(a, a +4, b);           //原样复制数组a到数组b
      copy( b,b +4, ostream _ iterator < double > ( cout," "));    //正向输出数组b,以空格隔开
      cout << endl ;
      sort(a, a +4);             //对数组a进行升幂排序
      copy(a,a +4, ostream _ iterator < double > (cout," "));     //输出数组a
      cout<< endl ;
      reverse _ copy( a,a + 4,b);     //将a的内容按逆向复制给数组b
      copy( b,b +4, ostream _ iterator < double > (cout," ")); //输出数组b
      cout << endl ;
    }

    程序输出结果如下:

    1.1  4.4  3.3  2.2 
    2.2  3.3  4.4  1.1 
    1.1  4.4  3.3  2.2 
    1.1  2.2  3.3  4.4 
    4.4  3.3  2.2  1.1

    演示数组降幂,查找,输出等方式

    #include < iostream >
    #include < algorithm >
    #include < functional >
    using namespace std;
    void main( ) {
      double a[]={ 1. 14. 43. 3, 2. 2};
      sort(a, a + 4) ;                        //升幂排序
      copy ( a,a + 4,ostream _ iterator < double > ( cout," "));  //正向输出数组a,以空格隔开
      cout<< endl;
      sort( a, a +4, greater < double > ( ) ) ;      //降幕排序
      copy ( a, a + 4, ostream _ iterator < double > ( cout," "));   //正向输出数组a,以空格隔开
      cout << endl;
      double * x =find(a,a + 4, 4. 4) ;        //查找
      if( x==a+4) cout << "没有值为4. 4的数组元素";
      else cout << "有值为"<< * x << "的数组元素
      cout << endl;
      x = find(a, a+48);        //x是double类型的指针
      if( x == a +4) cout << "没有值为8的数组元素";
      else cout << "有值为"<< * x << "的数组元素";

    输出结果为

    1.1  2.2  3.3  4.4
    4.4  3. 3  2.2  1.1 
    有值为4. 4的数组元素 
    没有值为8的数组元素

    对一组数组进行局部操作

    #include < iostream >
    #include < algorithm >
    #include < functional >
    using namespace std;
    void main( ) {
      double a[ ] = {1. 1, 4.4, 3.3, 2.2} , b[8] = {8} ;
      copy( a +2, a +4, ostream_iterator < double > ( cout," "));  //输出 a[2]和 a[3]
      cout << endl ;
      reverse _ copy( a + 1,a + 4,ostream _ iterator < double > ( cout," " ) ) ; //输出 a[3] ~ a[ 1 ]
      cout << endl ;
      copy (a, a +4,&b[4]); //将数组复制到数组b的尾部 //输出数组b
      copy( b,b + 8,ostream _ iterator < double > (cout," " ));   //正向输出数组b,以空格隔开
      cout << endl ;
      sort(a + 1,a +3); //对部分数组元素a[1]~a[2]升幂排序
      copy( a,a +4, ostream _ iterator < double > (cout," ")); //输出数组a,以空格隔开
      cout << endl ;
      sort(b,b +6, greater < double > ());   //对部分数组元素b[0]~b[5]降幂排序
      copy ( b,b + 8,ostream _ iterator < double > ( cout," "));      //输出数组b
      cout << endl ;
    }

    程序输出结果如下

    3. 3  2. 2                               //只输出a [2]和a [3]
    2.2  3. 3   4. 4                         //输出 a [3] ~a [1]
    8  0  0  0  1.1  4.4  3.3  2. 2        //数组b的内容 
    1. 1  3. 3  4.4  2. 2                    //只对中间2个排序
    8  4.4  1. 1  0  0  0  3. 3  2.2       //只对前6个排序

    演示对字符数组进行操作

    #include < iostream >
    #include < algorithm >
    #include < functional >
    using namespace std;
    void main( ) {
    char a[ ] = " wearehere!" , b[ 11 ]; //数组a省略的长度为11
    reverse(a, a + 10) ; //数组元素逆向
    copy ( a,a + 10,ostream _ iterator < char > ( cout)); 
    //输出逆向后的数组内容! ereheraew
    cout < < endl ;
    copy(a,a + ll,b); //原样复制到数组b
    sort(a, a+ 10); //默认升幕排序
    cout << a << endl ; //输出排序结果! aeeeehrrw
    cout << b << endl ; //输出数组b的内容! ereheraew
    reverse _ copy(a, a + 10, b) ; //逆向复制到数组 b
    cout <<b <<endl; //输出逆向后的数组b的内容wrrheeeea!
    reverse(b +2, b +8) ; //数组 b 部分b[2]~b[7]逆向
    copy(b +2, b +8, ostream _ iterator <char >(cout) ) ;
     //输出数组 b 逆向后的部分内容 eeeehr
    cout <<endl ;
    sort( a, a + 10, greater < char > ( ) ) ; //降幕排序
    cout << a << endl ; //输出排序后的数组a 的内容wrrheeeea!
    cout << ( * find (a, a + 10,'e' == 'e') << " " //找到某位置的字符是'e',输出1
      << ( * find( a,a + 10'0')== '0') <<< endl; //未找到某位置的字符是'0',输出0
    }

    程序输出结果如下:

    ! ereheraew 
    ! aeeeehrrw 
    ! ereheraew 
    wrrheeeea! 
    eeeehr 
    wrrheeeea!
    1 0

    说明:字符串数组需要一个结束符,正向复制可以不需要复制结束符,但逆向复制时要注意, 不能将这个结束符逆向复制,否则字符串的第一位变成结束标志,使其成为空字符串。

    七、数据的简单输入输出格式

    1、C++提供了两种格式控制方式,一种是使用ios_base类提供的接口,另一种是使用一种称为操控符的特殊函数,操控符的特点是可直接包含在输入和输出表达式中,因此更为方便,不带形式参数的操控符定义在头文件< iostream> 中,带形式参数的操控符定义在头文件< iomanip> 中。

    在使用操控符时,一是要正确包含它们,二是只有与符号"< <"或">>"连接时才起作用,三是无参数的操控符函数不能带有"()"号。

    2、常用操控符及其作用

    格式

    含义

    作用

    dec

    设置转换基数为十进制

    输入/输出

    oct

    设置转换基数为八进制

    输入/输出

    hex

    设置转换基数为十六进制

    输入/输出

    endl

    输出一个换行符并刷新流

    输出

    Setprecision(int n)

    设置浮点数输出精度n

    输出

    Setw(int n)

    设置输出数据字段宽度

    输出

    Setfill(char  ch)

    设置ch为填充字符

    输出

    Setiosflags(long flag)

    设置flag指定的标志位

    输出

    resetiosflags(long flag)

    清除flag指定的标志位

    输出

    上表中操控符使用时,后四个操控符必须包含头文件<iomanip>,其中后两个操控符的参数flag是引用C++的类ios_base里定义的枚举常量,要使用限定符"::",下面的表中是几个常用的ios_base定义的枚举常量,另外flag可由多个常量"或"起来使用,如:setiosflags(ios_base::showpoint | ios_base::fixed)。

    参数flag常引用的枚举常量及其含义

    常量名

    含义

    ios_base::left

    输出数据按输出域左边对齐输出

    ios_base::right

    输出数据按输出域右边对齐输出

    ios_base::showpos

    在正数前添加一个“+”号

    ios_base::showpoint

    浮点输出时必须带有一个小数点

    ios_base::scientific

    使用科学计数法表示浮点数

    ios_base::fixed

    使用定点形式表示浮点数

    使用setw设置输出宽度

    #include < iostream >
    #include < iomanip >
    using namespace std;
    void main(){
      int a =29,b = 1001 ;
      cout << a << setw( 6) << b << endl ;   //使b按域宽为6输出
      cout <<< setw(6) << a << b << endl;   //使a按域宽为6输出
    }

    程序输出结果:

    29   1001 
      291001

    setprecision功能演示

    #include < iostream >
    #include < iomanip >
    using namespace std;
    const double PI = 3. 141592void main( ) ;
    cout << PI << endl             //不设定系统只输出5位小数
      << setprecision(0) << PI << endl   //0等于不设,由系统决定输出5位小数
      << setprecision( 1) << PI << endl      //1代表显示整数数字
      << setprecision( 2 ) << PI << endl      //2才显示小数点后面的一位数,小数点也占1位
      << setprecision( 3) << PI << endl      //3显示小数点后面的2位数
      << setprecision(7 ) << PI << endl ;     //7显示小数点后面的6位数
    }

    程序输出结果:

    3.14159
    3.14159 
    3
    3. 1 
    3. 14 
    3.141592

  • 相关阅读:
    Ad hoc access to OLE DB provider 'Microsoft.ACE.OLEDB.12.0' has been denied. You must access this provider through a linked server.
    阻塞问题:会话是sleeping的,但是open_tran 不是0
    windows Server DNS服务器配置
    内存缺页
    "ros::NodeHandle"的用法:全局vs.私有
    python 判断当前执行用户是否是 root 用户
    docker 安装及启动 postgresql 及navicat 连接
    Mac 在环境变量中隐藏密码或者密钥等信息
    磁盘空间不足导致虚拟机无法启动
    VirtuaBox 下安装 Centos8 无法上网
  • 原文地址:https://www.cnblogs.com/LiangPF/p/13870308.html
Copyright © 2011-2022 走看看