zoukankan      html  css  js  c++  java
  • C/C++(C++类型增强)

    C++类型增强

    类型检查更严格

    把一个const类型的指针赋给非const类型的指针。c语言中可以通的过,但是在c++中则编不过去

    const int a = 10;
    a = 100;//const修饰的不能修改
    int *p = &a;
    *p = 100;
    printf("a = %d
    ",a);//a = 100,c里面类型不严密,指针能修改const修饰的变量,实际是a是const int *类型,也就是说强行的赋给int *,把const漏掉了。
    const int a与int const a一样,看const修饰谁把类型去掉。
    int *const p;把int去掉,p不能改变,p指向的内容可以改变。
    const int *const p;它指向的本身和内容都不能改变。
    
    #include<iostream>
    using namespace std;
    int main() {
        const int a = 100;//const修饰的必须要初始化
        int *p = &a;//不可以报错 const int *无法转化成int *;
        const int *p = &a;//才是正确的
        //C++不需要强转
        char *p = malloc(100);//C++会报错
        char *q = (char*)malloc(100);//void *
    
        return 0;
    }
    

    布尔类型(bool)

    c 语言的逻辑真假用 0 和非 0 来表示。而 c++中有了具体的类型。

    int main()
    {
        bool flag = true;
        if(flag)
            printf("hello world!
    ");
        else
            printf("hello C++!
    ");
    
        return 0;
    }
    

    真正的枚举(enum)

    c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而 c++中枚举变量,只能用被枚举出来的元素初始化。

    bool用枚举实现过程:

    #include<iostream>
    enum BOOL
    {
        FALSE,TURE
    };
    int main()
    {
        const int a = 100;
        BOOL flag = TRUE;
        bool aa = true;
        if(flag)
            cout<<a;
            printf("sizeof(flag) = %d sizeof(BOOL) = %d sizeof(bool) = %d
    ",sizeof(flag),sizeof(BOOL),sizeof(bool));
    }
    //sizeof(flag) = 4 sizeof(BOOL) = 4 sizeof(bool) = 1
    //enum枚举本质是整型
    

    它和即将所学的string类型并不是实际意义上的数据类型而是一个对象。

    enum SEASOM
    {
        Spr,Sum,Autu,Win
    };
    int main()
    {
        SEASON s;
        s = Win;//在C++中比较严格,除了枚举外的无法赋值。c里面就可以赋其他值。
        return 0;
    }
    

    其实枚举可以和宏来等价

    #define Spr 0
    #define Sun 1
    ....
    
    
    enum
    {
        Spr = 1,Sum,Autu,Win
    };
    

    在C++中经可能的使用枚举,const代替使用宏。

    表达式的值可被赋值

    c:

    int main()
    {
        int a,b=10;
        a = b = 100;//100赋值给b,b = 100这个表达式赋值给a。
        (a = b) = 100;//错误,表达式是不可被赋值的
        (a != b?a:b) = 1000;//错误
        return 0;
    }
    

    c++

    int main()
    {
        int a,b = 5;
        (a = b) = 100;
        printf("a = %d b = %d
    ",a,b);
        (a != b?a:b) = 1000;
        printf("a = %d b = %d
    ",a,b);
        return 0;
    }
    //a = 100,b = 5;
    //a = 1000,b = 5
    //a = b是一个表达式,b的值赋值给a,最后把100的值赋值给a,b的值没发生变化。
    

    体现C++对C语言的限制与提升

    cin cout类对象

    scanf printf函数的功能相同

    int main()
    {
        char name[30];
        scanf("%s",name);//不安全的输入,输入很多会挂机
        fgets(name,30,stdin);//最多只能输入29个字符,比较安全。
    
        cin>>name;//>>流输入运算符
        cout<<"name = "<<name<<endl;
    //"name = "字符串流入cout对象,name流入cout对象,endl(换行)流入cout对象中,从左至右的顺序。
    
        string name1;
        cin>>name1;
        cout<<name1;
        //很安全,输多少都不会挂机
        cin>>a>>b;//有顺序,从键盘输入的第一个数流入a,第二个数流入b
        //<=>
        cin>>a;
        cin>>b;
    
        return 0;
    }
    
  • 相关阅读:
    插头DP专题
    HDU 4873 ZCC Loves Intersection(JAVA、大数、推公式)
    HDU 4865 Peter's Hobby(概率、dp、log)
    HDU 4870 Rating(概率、期望、推公式) && ZOJ 3415 Zhou Yu
    HDU 4862 Jump(最小K路径覆盖)
    codeforces 449B Jzzhu and Cities (Dij+堆优化)
    2014 12th GDCPC 总结
    HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)
    UVALive 4949 Risk(二分网络流、SAP)
    Codeforces 1105D(双层广搜)
  • 原文地址:https://www.cnblogs.com/intelwisd/p/8503398.html
Copyright © 2011-2022 走看看