美文网首页
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++学习随笔(二)

    未经本人授权,禁止转载 大家好,这里是凛刃。目前暂定每个随笔会谈到10个点,希望这个数量和质量能适合大家的阅读。 ...

  • HIDL实战笔记

    目录 第一篇:HIDL学习笔记之HIDL C++(第一天)第二篇:HIDL学习笔记之HIDL C++(第二天)第三...

  • C++学习二

    一、构造函数和析构函数 二、拷贝构造函数 三、常量相关 四、static关键字 五、this 六、友元函数 七、友...

  • C++学习随笔(四)

    未经本人授权,禁止转载 这一部分会详细谈谈类 1. include" "与include< >的区别 includ...

  • C++学习随笔(一)

    未经本人授权,禁止转载 大家好,这里是凛刃。C++是一门非常繁杂的语言,每一遍学习的过程总有新收获,但是总有些小地...

  • C++学习随笔(三)

    未经本人授权,禁止转载 这一期的全部内容几乎都是函数相关 1. 基于范围的for循环 这是C++11的新特性,下面...

  • C/C++学习路线图--C高级编程

    黑马程序员的C/C++学习路线图大纲中第二阶段的学习是C高级编程的学习:主要介绍了C/C++学习路线图的C高级编程...

  • c++学习文档-更新于2020年12月05日

    c++学习文档汇总 [TOC] c++ primer部分 c++学习笔记 引用(左值引用) int &ref...

  • NDK开发案例 | C/C++调用java层代码

    随笔分类 - jni NDK开发(三)——C/C++代码如何调用java层代码 MainActivity hehe...

  • C++学习笔记二

    使用类 运算符重载 重载后的运算符必须至少有一个操作数是用户定义的类型 使用运算符时不能违反原来运算符的句法规则,...

网友评论

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

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