c++ primer 学习漏洞总结区 ch3-ch4

ch3

ch3-1

头文件中一般不会使用using,因为头文件需要被引入到其他的文件中,那么using就会给源文件里的名字带来冲突。


ch3-2

string的直接初始化和拷贝初始化 前者是利用利用相应的构造器进行初始化,而后者则是通过等号对另一字符串进行拷贝

关于string的>> 通过键盘读入存在缓存中,然后剔除前部多余的空格,开始读取字符串,直到遇到空格,非法输入,或者结束标记。

getline方法 getline则会保留所有的空格,一直读取知道遇到换行符或者结束标记,而且换行符会给扔掉,不会存进string里面,如果读取时碰到的第一个就是换行符,那么就会得到一个空的字符串。

关于字符串的相加操作:二者相加,其中有一个必须是字符串,另一个可以使字符串也可以是由“ ”包围的字符串字面值,而且整个相加过程为从左往右


ch3-3

何为类模板 类模板需要我们给他提供相应的信息,然后通过实例化创造出真正的类

vector作为矢量容器,能够容量大部分的对象,而引用不是对象,所以不能被存放在vector里

对vector的初始化方式,有默认初始化,里面啥也没有,有利用构造器初始化的,还有拷贝初始化,最有特色的当属利用列表初始化,利用{}扩住之后的成员
例如:vector v{“1”,“2”},同样也有一种特殊的批量初始化方法vector v(len,val) 那么里面就会有了len个val

不建议在for循环遍历vector成员时为vector添加新的成员

对于vector来说,它能够动态的增长,但是它动态增长的时候需要消耗时间,有时候因为连续的空间不足,它可能还需要去寻找新的空间,这都要耗费大量的时间,所以建议若是一开始就知道整个vector大概会有多大时就给它初始化多大的空间

当仍未对vector对应位置进行初始化,那么用下标访问该位置就是非法操作


ch3-4

尾后迭代器 A.end()所返回的迭代器,将会指向A的最后一个元素的下一个位置
(注意,当A为空时,那么begin和end将会返回的迭代器将会指向同一个位置),注意该迭代器不能用来做递增操作和解引用操作

关于== 当两个迭代器指向同一个元素,或者他们指向同一个容器的end位置时,==就会返回true

关于iterator和const_iterator,前者只能够指向非常量的成员,而后者既可以指向非常量成员也可以指向常量成员,后者要求仅能对成员进行读取操作,而不能进行任何的修改操作,想要获得后者,那么我们需要运用的函数叫做cbegin,例如A.cbegin()就会返回一个常量迭代器

关于迭代器的运算 加法毫无意义,但是减法却可以获得两个迭代器之间相差的成员个数,而这个个数可以是正的也可以是负的


ch3-5

关于数组 相较于vector,它的长度是固定的,而且会缺乏一点灵活性,但是它的性能还是非常好的,在我们声明数组的时候,[ ]里面用到的必须时常量表达式,任何auto型变量都不行

关于字符数组和字符串字面值,当我们要用=将后者赋值给前者的时候,我们需要预先增加一位的空间,以便存放字符串的结束字符\0

注意,数组是没有办法对数组进行直接的拷贝赋值的

☆☆☆关于复杂的数组声明判定:
①int *p[10] 当没有出现括号的时候从名字开始,名字叫p然后往右,好指向一个大小为10的内存空间,然后每个空间存的是int指针,所有p是一个指针数组
②int (*parray)[10] 有括号先看括号里的,好是一个指针,名字叫做parray,指向一个大小为10的空间,空间存的是int变量,好了,parray是一个int数组的开头指针
③int (&arrRef) [10] 好的首先arrRef是一个引用,引用的对象大小为10,里面装的是int类型,所以arrRef是一个对于大小为10的int数组的引用
注意:引用由于不是对象,所以引用是没办法成为数组的成员的

当我们用auto i(array)时,i就会获得一个指针,指针类型与array的的成员类型一致,例如array是一个int数组,那么i就能获得int指针。

数组用的begin和end函数:前者返回指向数组第一个成员的指针,而后者返回指向最后一个成员的下一个位置的指针。

关于指针的比较运算 与迭代器上类似,唯有是指向同一个数组当中的元素的指针才有比较得价值。

可以通过过指针与下标结合,以现指针做相对寻址,找到对应的元素,而且指针的下标可以为负数**(but,数组的下标必须不能是负数)**

c风格字符串: 即一个字符数组,而且末尾要以空字符结束
当我们使用strcat时,当最后结果的长度大于存放结果的字符数组的大小,那么就会报错

string与c风格字符串相互之间的赋值:
①string类型可以直接用字符数组来初始化 string s(arrary)
②但是c风格字符串要想用string来赋值则要经过一个函数 char *str= s.c_str()
(但是若果之后s发生了变化,同样会影响到str,所以最后用拷贝复制一下字符串数组)


ch3-6

关于多维数组的遍历: 最会采用下标去遍历,也可用foreach循环,但是用auto去取的时候,要注意多维数组的上层维度里面存的元素其实是数据类型的指针,要取其引用才能获得对应下层元素的数组
在这里插入图片描述
例如这一part,row取到的是一个指针,指针本身无法执行foreach,所以内循环出编译失败


ch-4

ch4-1

重载运算符的特性:
我们可以决定其新的运算对象,返回类型,但是我们却无法改变其固有的优先级,运算对象个数,还有是否适用结合律。

关于左值、右值:
前者可以作为赋值运算的左边而存在,右值则是非左值的存在,从本质上来看,前者提供的是一个位置,而后者提供的是一个值
规则如下:
在这里插入图片描述
当我们对一个指针解引用求decltype时,我们会得到一个指向该对象的引用,而对取地址求decltype时,我们则会得到一个指向该对象的指针

当我们在某个运算中的一部分改变了某个变量的值,那么不适宜在运算的其他部分继续使用该数值

ch4-3

各种逻辑运算符: 唯有逻辑非是右结合的
在这里插入图片描述
对于关系运算来说:一般来说,运算皆为从左至右

ch4-4

赋值运算要求其左边部分必须要是一个可以修改的左值

赋值运算符满足的是右结合,即会先把=右侧部分完成再交给左侧,从右至左

例if(a=b) 中赋值运算符返回的是b的值,当以此值做判断的时候,唯有0才为假,其余皆为真。

ch4-6

关于选用前置递增,后置递增:一般来说,如果原值派不上用场,我们就会选用前置递增,这样能够减少没必要的运算。

ch4-9

关于sizeof 运算符: sizeof 并不实际去访问对象或者类的内部,而是通过类型的定义直接获得大小,一个未初始化或者无效的指针均可以,同时对该指针的解引用操作也可以进行sizeof,并不需要真正去解引用。

ch4-11

关于隐式转换
在这里插入图片描述
除去算术转换,还有这么几种隐式转换:
①数值对指针进行赋值,那么指针就会变成指向数组的首个元素的指针
②指针的转换: void* 指针可以赋值给任意指针,而所有非常量指针也能转换成void*,指向对象的指针可以转换成为const void*
③转换bool类型: 任意数值皆可以转换成bool
④转化为常量 任意数值均可以转化成常量,但是不能用非常量引用去引用常量
⑤类类型的转换: 字符串的字面值,就可以转换成为string类型
⑥关于is转化为bool类型,IO库定义了从is转换成为bool的方法,当is上一次读取成功时返回true,否则返回false

关于显式转换: 有三种
①static_cast 只要没有底层const的都可以使用,知道并且不在乎潜在的精度损失。
格式 double dp = static_cast<double> p;
newtype a= static_cast <newtype#> b;
②const_cast 只能改变底层const,但是不能改变类型,想要强制改变类型则会到则编译错误
③reinterpret_cast 用于将对应的内存部分,进行重新解释,指鹿为马。

ch4-12

超级重点部分: 优先级从上到下降低
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值