c++ primer 学习漏洞总结区 ch1-ch2

ch-1

1-2

输出运算符 << :os<< A 其实就是把右侧的内容传到左侧的流中,流则会将内容传到待输出的缓存区中,然后返回原来的输出流,但是只有在流接收到endl(亦称操纵符)时才会将所有的内容输出到输出设备上

输入运算符 >> :原理接近于前者,但是会有一定的匹配功能,比如 is>>int 那么就会接受一个int类型,碰到非数字字符的时候就会停止,扔掉那个无关字符,然后返回is继续完成第二个输入。

作用域操作符 :: :指明想要用的库,避免产生名字冲突。而且::A可以直接用来指示全局下所定义的A。

1-4

while(is>>A) :因为输入完之后会返回的流,此时while的条件就会检测is,若是is成功输入,那么为真,若是遇到文件结束符(当键盘的输入的时候,crtl+z就是结束符),或者读取的是整型,却传来一个字母,就会返回无效状态,然后为假,结束循环

1-6

关于c++的类型检查,c++作为一种静态数据类型语言,会在编译的时候就检查数据类型,而Python则会在运行过程中才检查,它是数据不严格的,动态进行调整。


ch-2

2-1

char与unsigned char,signed char : 前者用来表示的是字符,而后面两者则使用表示较小的有符号数和无符号数

无符号与有符号的运算:将会将有符号转化无符号再进行运算

cout<<“A”“B”<<endl : "A"被视作常量字符组成的数组,可以连用 ;而且转义字符可以用数字去替换其\后的字母
例如:\12等同于\n
注意!在反斜杠后面只有8进制或者16进制,带x的是16,其余不管前面补0与否都是八进制,最大三位

各种字面值的前后缀:
在这里插入图片描述
例子:
练习2.5 中的:L“a” 表示的是一个里面元素全是宽字符类型的常字符数组,有一个元素a,还有一个元素\0

2-2

赋值与初始化: 二者要区分开来,前者是抹除当前的值再用新值代替,而后者则是在创建的初期赋予一个初始值。

关于列表初始化:
传统的初始化流程 int A=val; 会将val自动转化为A的数据类型再赋予为A的初值
列表初始化流程 int A{val}; 不会转化,若是数据类型对不上就会报错
关于全局赋值和局部赋值:c++中规定,全局的数字类型变量将都会赋值为0,而局部的则不会给他初始化,若不初始化就用就会报错。
字符串的初始化 :字符串本身具有无参构造函数,会自动生成一个空串,仅有一个\0

关于声明与定义:
在这里插入图片描述
前者用于声明,后者用于定义,声明可以有多次,但定义只能有一次,
重复定义会报错;而关于声明,其实他的作用是为了作为一个接收器,去接收别人文件已经定义了的变量
(注意,不能给声明做显式初始化,否则将会把它变成定义)

2-3

何为引用: int &r= v; 在此定义之下,将会将r作为v的别名,对r操作等同于对v操作,引用类型r的类型为int,则v必须也要是int类型,且要是一个int的对象,或者int的引用也可以,不能没有。(引用一旦初始化将没办法再绑定其他对象)

何为预处理变量:即由预处理器管理的变量,不属于任何命名空间,如NULL,现如今对指针进行初始化最好使用nullptr。

不能通过void*指针来操作它所指的部分,因为当不清楚类型时,无法决定操作,但可以指向任何类型的地址。

int是不能直接传给int*的,即便int里面本身存的是个地址,必须用地址符告诉指针这是个地址

当定义变量的时候公式(简单版)如下 基本类型(复杂类型) 修饰符(&,*) 变量名。
例如int * p1,p2,其实本质上是p1为int指针,p2是int类型

引用的本身不是对象,所以指针不能指向引用;指针是对象,所以引用可以引用指针
例如:int *&r=p; p是一个指针,而r就是对其的引用

2-4 ☆

const对象必须要进行初始化,因为const需要锁定这初始值,但是可以用字面值或者普通的对象去对它进行初始化

默认情况下,const只在自己的文件底下有用,但是有一种特殊情况,可以使得const常量可以在多个文件下共用,则要在其声明和定义的语句上都加上extern
在这里插入图片描述
const常量只能被const常量所引用,所以无法被引用所改变(但是常量引用可以引用非常量对象,字面值,甚至一般表达式,而且形式不一时,会将其传到临时量上,再传给常量

常量只能由常量指针来指向,但是常量指针可以指向非常量,在这种情况下,不能通过指针去改变所指的数值,但是可以通过其他手法去改变。

指向常量的指针和常指针之别:(常指针即指定的对象不变,不是对象的值不可变)
前者的定义方式 const type p=adress;
后者的定义方式 type * const p=adress;
阅读的方式 从右往左,例如指向常量的指针,先是名字是p,然后是,所以是一个指针,然后是其所指向的内容是一const的type,所以p是一个指向常量的指针

何为顶层const和底层const:顶层则是你自己不能变,而底层则是你所指的或引用的不能变。顶层靠右,底层靠左。(执行拷贝操作是要求有具有相同的底层类型)

区分常量表达式与常量:
常量只要求定义为常量,但是前者则需要在编译的时候就给出计算结果的表达式,且值在后续不会发生改变。

constexpr定义的量要求是常量,而且必须用常量表达式来初始化(C++11标准下,允许用一个足够简单的函数,在编译的过程就能得出结果,来初始化constexpr)。

2-5

typedef typedef double *p means:p是一个double指针的同义词

using using A = B 即将A看作是B的别名

在这里插入图片描述
如何去理解第二行,按从右往左,首先名字叫做cstr,其是cstr,也就是一个字符指针,然后再到const,就是该指针是常指针**(不能拆开pstring来进行理解,这是一个独立的类型)**

☆auto:通过输入的值去推断输出的值的类型,而且auto还会略过别名,直指你的本质,如用int引用类型赋值给auto类型,就会得到int类型**(而且在转化过程会忽略你的顶层const,就是auto定义出来的是一个变量,除非你在前面给他带个const的帽子,保留你的底层const,原来指的是常量,之后也会是)**

在这里插入图片描述
第一行ci是一个常量int,g是一个对常量int的引用
第二行42是一个字面值,要用引用绑定字面值,则必须要是常量类型的引用,给带个帽子
总结:对于auto引用来说,若是后面是常量,能检测到(顶层const被保留下来),自动变换,不用戴帽子,若是字面值,则需要带个帽子

decltype:通过获取操作数的返回类型去定义其他量,如果操作数里是解引用操作,那么就会返回引用的类型,如果操作数里还有一层括号那么就会返回引用类型。

auto与decltype的差别:①前者需要通过编译器计算初值,从而确定类型,后者不用 ②前者可能会得到与初始值不同的类型,比如给的是int的引用,auto就会变成int,而后者则会完全依照类型,得到int引用 ③前者一般都会忽略掉其顶层const,而后者会保留下来哦

关于头文件保护符:起到一个防止一个头文件被重复地包含进来,同预处理变量来实现的,若是已经进来过了,那么已经被定义过,则条件返回为否。
相关知识

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章