开启C++Primer学习之旅,因为之前学过了谭浩强的C语言和C++,有一定的C++皮毛基础了,所以这个笔记系列就主要是再进阶一步,会记一些之前没理解清楚的知识。
当然,学的时候尽量带着感觉自己智商低一点的心态去学吧,要不然会被虐哭,因为这只是一本入门书(狗头)
这篇笔记的内容是变量与基本类型。
一、基本内置类型
1.算术类型
2.字面值常量
2.1 定义:
即数据类型所对应的值。包含整型和浮点型字面值,字符和字符串字面值、布尔字面值、指针字面值、转义序列等等。比较要注意的是转义序列
二、变量
1.初始化
1)关于初始化与赋值
到目前我还是不太弄清二者的更深的区别,等待后面再进一步理解吧。
2)列表初始化
使用花括号注意编译器可能会报错。
2.声明与定义
说实话讲了那么一大堆还是比较懵,但是百度百科是这样定义的:声明与定义_百度百科
3.标识符
其实就是变量的名字
关于变量命名:
总结以下:变量小写、自定义类名大写字母开头、多单词组成的话用驼峰或者下划线区分层次。
4.名字的作用域
就是变量的作用范围,作用域的单词是scope,在报错的时候会经常看到这个单词,具体参考:名字的作用域 - 抑或 - 博客园
三、复合类型
1.引用
这一块感觉内容有点多,不过要知道有左值引用与右值引用,平时讲的引用主要是左值引用。
要注意的是引用只能一次机会,引用到第一次赋初值的变量,后面再赋值是不起作用的。
如:
char s1='1',s2='2';
char &s=s1;
s='a';
s=s2;
s='b';
std::cout<<(s1)<<endl<<(s2)<<endl; //最后s1=b,s2还是等于2
其他进一步参考:C++ 引用 | 菜鸟教程
2.指针
1)定义
2)指针值
3)关于何时是声明何时是取地址、解引用
解引用与取地址是一对互逆操作。关于什么时候是指针什么时候是解引用在于看符号出现的位置。
4)指针值问题
即在不知道拿指针干嘛的时候,尽量把指针设置为nullptr或者0。
5)void指针
参考:void指针及其应用,C语言void指针及使用注意事项详解
6)指向指针的指针与指向指针的引用
(其他的补充)一般连续变量他的地址都是紧挨的,但是会有边界对齐规则,关于边界对其可参考之前的计组内容:计算机基础课--计组学习笔记(2)_qq_42987967的博客-CSDN博客
我举个例子:
char s1='1',s2='2',s5='3';
int i1=7,i2=8;
char s3='1',s4='2';
char *p1=&s1,*p2=&s2;
int *p3=&i1,*p4=&i2;
char *p5=&s3,*p6=&s4,*p7=&s5;
std::cout<<(int)p1<<endl<<(int)p2<<endl<<(int)p7
<<endl<<(int)p3<<endl<<(int)p4<<endl<<(int)p5<<endl<<(int)p6<<endl;
运行结果:
结合我手制的低分辨率图可以更好地理解一下这个过程:
如果知道了计算机的小端存储以及边界对齐就知道为什么地址是这样排列的了。再根据操作系统的内存管理知识,要是我们合理设置变量的排列顺序是能够降低使用内存的。
四、const限定符
注意:这一块逻辑挺复杂的,很容易就绕晕了
1)引出
注意最后一点即可。
2)const的引用
解读 a.即const常量对象的引用也需要加const限定,非常量引用无法指向const常量对象。
double dval=3.14;
const int &ri=dval;//该步骤编译器会创建一个临时变量,ri引用的是该临时变量
dval=4.1;
std::cout<<ri<<endl;//ri不等于4,而是等于3
ri=2;//报错,ri无法改变
解读b.即从double到const int&的时候,编译器是会经过一个临时变量的转换的,亦即ri其实引用的并不是dval变量,而是引用的temp变量,所以改变dval的值的时候,ri的值不变,还是3。
解读c.这时候r2无法修改r1和i的值,但是当i的值发生改变,r2的值也会跟着改变,这个是与解读b不同之处。
3)指针和const
解读a.只有const修饰的指针才能指向const常量(const常量必须用const修饰的指针指向);若const指针指向的是非常量,那么无法通过指针改变该非常量的值(即给*cptr赋值会报错),但该指针还可再指向其他变量。
const指针
解读b.注意:const指针与const修饰的指针不同,const指针变量其无法再指向其他变量,但可通过const指针变量修改指向变量的值;而const修饰的指针则相反,可再指向其他变量但无法用指针修改值。
4)总结:顶层const与底层const
5)其他的const补充
常量表达式:
上面的说的都很有道理,都很容易理解出错。
constexpr变量
constexpr变量的限定条件比const更多。
字面值类型
解读: 在这引出了字面值类型的概念,只有字面值类型的变量才可用constexpr修饰
const只有顶层const的功能,这说明了他的功能范围比const小多了。
关于constexpr修饰的指针要注意,容易出错,需要全局变量的地址作为其值,例子可参考:
constexpr指针_东风起的博客-CSDN博客_constexpr指针
五、处理类型
1.类型别名
两种办法:别名声明和关键字typedef。
指针、常量与类型别名
加上const后,简单的问题也变得稍微复杂了起来。
这里值得注意的是:const pstring cstr其实是等于char *const cstr
2.auto类型说明符
这个类似C#和JS中的var,是一种弱类型。
当auto与const结合起来(感觉const就是个搅屎棍,乱不乱,const说的算)
3.decltype类型指示符
decltype在面对const问题上与auto有所区别,并且decltype在对引用的处理也是比较奇葩值得注意。
当decltype是双括号时:
六、自定义数据结构
这一块主要就是面向对象的知识了,主要留到后面讲,在这就记录一下预处理器这一块吧。
预处理器概述
七、补充
补充1:一个比较好玩的地方:
补充2:关于include与using: