美文网首页
C++学习随笔(二)

C++学习随笔(二)

作者: 宇宙巨炮 | 来源:发表于2020-03-23 12:53 被阅读0次

    未经本人授权,禁止转载


    大家好,这里是凛刃。目前暂定每个随笔会谈到10个点,希望这个数量和质量能适合大家的阅读。


    1. 数组的那些坑

    这个看似简单的问题却存在许多容易忽略的细节。

    int array1[10];    //定义了一个容量是10的数组,但是并没有初始化
                      //此时数组里面成员的值是不确定的,具体是该数组被分配到的内存之前的残留值。
    int array2[10] = {0,1,2,3,4,5,6,7,8,9};    //使用初始化列表完整的初始化了一个容量是10的数组
    int array3[10] = {23,45};    //使用初始化列表初始化了前两个成员的值,剩下的8个成员自动赋值为0
    int array4[10] = {0};    //这个方法可以直接把数组里的所有成员赋值为0
    int array5[10] = {};    //花括号里什么都没有,效果等于上一行代码,把数组里的所有成员赋值为0
    int array6[] = {123,314,123,145};    //这里[]里什么都没有,编译器自动使array6成为具有4个成员的数组
    
    • 使用初始化列表"="是可以省略的
    • 字符数组只能在定义的时候初始化,定义好之后只能赋值;字符数组不能赋值给字符数组,但是string型可以直接赋值给string型

    2. 烦人的字符串在C++获得了新生

    1. 学过C语言的各位是不是被笨重的char字符串及其各种方法折磨的很惨,但是C++的string类让一切变得非常简单,不过我们还是要了解char字符串的那些“坑”。
    char str1[5] = {'a','b','c','d','\0'};    //使用初始化列表
    char str2[12] = "linren";    //初始化列表初始化字符数组有些复杂,这个方法很简便,而且会自动在末尾添加'\0'
    char str3[] = "hahaha";    //这里让编译器去识别str3的大小,不过依旧不建议这样做
    
    • char字符串其实就是char数组,但是char数组字符串的最后一个成员必须是'\0'
    • 程序在处理字符数组时是按照空字符'\0'的位置,而不是数组大小,但是一定要确保数组大小大于字符数,千万记得算上空字符'\0'的位置

    - 接下来巨大坑警告!!!

    • 代码char shirt = 'S';实际上是把S的编码83赋值给了shirt.
    • 代码char shirt = "S";是不合法的,"S"虽然实际上是两个字符S和\0组成的字符串,但是在这个代码赋值的时候是把"S"所在的地址赋值给了shirt,但是C++的地址又是独立的类型,所以这种做法是不允许的,需要指针的介入
    2. char字符串与string型
    • 赋值,char字符串:strcpy(char1,char2);string型:str2 = str1;
    • 拼接,char字符串:strcat(char1,char2);string型:str2 += str1;
    • 长度,char字符串:strlen(char);string型:str.size();

    3. 字符串的输入

    • cin每次读到空白:空格、换行符、制表符就会自动停止
    • cin.getline(char,size);读取一行丢弃换行符,cin.get(char,size);读取一行保留换行符,这里丢弃和保留指的都是在输入队列中
    • cin.getline(cin,str);这里和上面的getline在参数上有很明显的区别,这是因为这里的getline是string类里的函数

    4. 初始化列表详解

    初始化列表其实就是用{}去赋值,{}里可以对变量、数组、结构体的任意数量成员赋值,没有赋值的自动赋值为0。

    int num = {123};
    char chr[10] = {"a","b","c","\0"};
    struct xixi
    {
        int a;
        float b;
        std::string c;
    };
    xixi m_xixi[3] = { { 1,2,"rrr" } , { 3,4,"ttt"} , {5,6,"yyy"} };
    

    5. 共用体union

    union用的比较少,他和结构体的声明一样,可以在共用体内部定义多种类型的变量,但是同一时间只能是其中一种,可以通过再次赋值改变共用体的数据类型。
    当一个变量具有多种属性但是只能存在一种,那么使用共用体可以节省内存。

    6. 枚举enum

    enum在C项目中使用频率极高。enum spectrum{ red, orange, blue, yellow, gray, black };
    spectrum就是一个枚举,red、orange、blue、yellow、gray、black就是spectrum里的常量成员对应0~5,枚举的所有成员本质都是整型。

    enum spectrum{ red, orange, blue, yellow, gray, black };
    spectrum band;    //定义一个枚举量band
    band = blue;    //band只能被赋值为枚举spectrum的其中一个成员
    int color = gray;    //枚举量成员可以强制转换为int,但是反之不行
    enum bits{one = 1,two = 2,four = 4,eight = 8};    //可以主动给枚举成员赋值,不赋值默认从0开始
    enum bigstep{first,second = 100,third};    //第一个成员没有赋值,默认是0;第三个成员没有赋值,默认延续上一个成员,所以third是101
    bits myflag;
    myflag = bits(4);    //还可以通过这种方式给枚举量myflag赋值
    

    7. 指针的那些坑

    指针是一种存储地址的变量。
    • &变量:取变量的地址;&指针:取指针自己的地址
    • *指针:取指针指向地址存储的值
    • 初始化指针的时候一定要给指针分配好地址,具体做法:
    int* ptr;
    ptr = (int*)0xB8000000;
    

    但是更建议用接下来的new指令,C++的优势之一

    • new指令分配内存:typename* ptr = new typename;
    • delete指令释放内存:delete ptr;只是释放了指针指向的内存,指针本身依旧存在;且delete只能用于释放new出来的内存
    • new创建动态数组:
    int* parray = new int [10];
    delete [] parray;
    parray = parray + 1;    //将parray这个指针指向的地址向后移一位,parray[0]变成了原来的parray[1]
                            //将指针移位后不再能使用delete,必须得-1移回原来的位置才能使用delete销毁
    

    8. 自动存储、静态存储和动态存储

    • 自动存储:花括号代码块内的常规变量,随着代码块的结束自动销毁,通常存储在栈中
    • 静态存储:函数之外的的变量或者static生命的变量,他们在整个程序的运行期间都存储在内存
    • 动态存储:new和delete在自由存储空间(堆)上管理内存,他和自动存储静态存储是分开的

    9 递增运算符++和递减运算符--

    ++和--前置是先进行增减运算再进行诸如赋值等运算,++和--后置是先进行诸如赋值等运算再进行增减运算,只是单纯的使用这两种表达式几乎没有任何区别,注意这点就好。

    int x = 5;
    int y = x++;    //y = 5, x = 6
    int m = 5;
    int n = ++m;    //n = 6, m = 6
    
    • 前置使用效率更高

    10. 逗号运算符

    这是一个不常使用但是很有用的方法,在for循环内可以使用逗号运算符

    for(int i = 0 , int j = 1 ; i < j ; i++ , j++){
    ...
    }
    

    相关文章

      网友评论

          本文标题:C++学习随笔(二)

          本文链接:https://www.haomeiwen.com/subject/vntwyhtx.html