c++基础

基本数据类型:
算术类型:整形(包括字符和bool)+浮点型
char类型存放的是基本字符集,wchar_t是机器最大扩展字符集, char16_t, char32_t是unicode字符集级所有自然语言字符集
int至少和short,long至少和int,long long至少和long
32位和64位是指字是由32bit还是64bit构成的 地址对应的是字节
带符号类型能正负零,不带符号是正零,int short long long long都是有符号,加unsigned变成无符号,usigned int被简写为unsigned
当一个表达式中既有int又有unsighed时,int转为unsigned 从 无符号减一个数时,结果必须是正值
标识符命名不能以数字开头,不能__,不能_A,长度不限,函数体外的不能以_开头
sizeof运算符,返回的是表达式(返回表达式结果类型的大小)或变量所占的字节数,在sizeof中解引用无效指针也是可以的,因为sizeof不需要真的解引用指针也能知道他所指的对象类型,对数组是数组所有元素sizeof的总和,对string返回的是固定的值,sizeof返回值是常量表达式可以声明数组
sizeof满足右结合律,且优先级比乘除法高
当我们给带符号类型赋超过范围的值,结果是未定义的,未定义就是编译器想怎么干就怎么干

类型转换:
表达式中既有整数又有浮点数,整数会被转换为浮点数,然后结果在被转换为int
隐式类型转换,就是自动转:比int小的整形会被提升为大正向,条件判断时,非布尔会被转换为布尔型,赋值过程会把右侧的值转化为左侧的值,以及算术运算有多种类型,如果运算符的运算对象类型不一致,会把他们转换为同一类型(变成大的那个)
char + float会先把char提升为int,在转换为float
整形提升:把小整数转换为大整数(int及以上,但要是最小能容纳的,也只有小整形会转换)
其他隐式转换:数组被转换为首元素地址,但有&,sizeof的时候,不会转换,如果用引用初始化数组也不会发生? 指针被转换为布尔类型
while (cin >> s)时读入成功,得到的时true,繁殖为false,在常量赋值时非常量会被转换为常量
int会转化为unsigned,unsigned会转化为double,如果无符号类型不小于带符号类型,就转为无符号的
显示转换:

2.2变量
初始化不是赋值,初始化时创建变量时赋予一个初始值,而赋值是擦除对象当前的值用一个新值来代替
用{}初始化叫列表初始化,当列表中初始值丢失信息的时候会报错,而()或直接复制就不会
默认初始化:如果是内置类型的变量未被初始化,他的值由定义的位置决定,在函数体外被初始化为0,
定义在函数体内部的内置类型,如果不初始化的话是未定义的,访问它可能会引发错误
转义序列:有两类字符不能直接使用,一类是不可打印的字符,一类是有特殊含义的字符,这时需要用到转义字符,转义字符后面一般是8进制
我们可以通过加前缀和后缀改变整形,浮点型和字符型字面值的默认类型
-m/n = m/-n = -(m/n) -m%n = -(m%n) m%-n = m%n

2.3复合类型
1、引用
p38提到,一条声明语句是由一个基本数据类型和火箭随其后的声明符列表组成,每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型(基本数据类型里声明符就是变量名,但复合类型的声明符更复杂一点)
引用就是给对象起了另外一个名字(这两个其实是同一个东西,相当于外号,操作哪个都一样),将声明符写为&d来定义引用类型,d是变量名,引用必须被初始化,在初始化时,并不是将值拷贝到新的对象中,而是将引用和对象绑定在一起,而非拷贝,初始化完成后,他们就一直绑定了,不能修改
要注意引用不是对象,只是给已有的对象起了另一个名字 所有对引用的操作都是对与之绑定的对象的操作 引用的值就是原来对象的值,而不是地址什么乱七八糟的
不能定义引用的引用 可以int a = 0; int &b = a; int &c = b;但不能int &(&e)这样
引用的定义方式:int &r = i, r2 = i2第一个是引用,第二个是int
引用类型要和对象严格匹配,引用只能绑定在对象上,而不能是字面值或者表达式的计算结果在一起

2、指针
引用不是对象,只是已存在对象的另一个名字,指针是对象
和引用不同点:指针在生命周期里可以先后指向不同的对象,指针在定义时可以不赋值,这样就默认初始化
定义指针的声明符是*d,d是变量名 double dp, *dp2,第一个是double,第二个是指针
指针是用来存放某个对象的地址,获取该地址要用&,我们不能定义指向引用的指针
除了特例(函数也有特例,忘写了),指针类型要和所指对象严格匹配
double *i = &d; 初始值是指向double型的地址 double *o = i;是对的,初始值是指向duoble对象的指针
指针的值就是地址 我们可以用解引用符访问指针指向的对象 note:解引用符只适用于确实指向了某个对象的指针 因为&有两重含义,我们要根据上下文进行判断
空指针:int *p = 0 / nullptr; 注意,我们不能直接int变量 直接赋给指针,即使int变量的值为0也不行
对指针赋值就是让他保存一个新的地址,指向另一个对象
如果我们分不清赋值值改变指针的值还是改变指针指向的对象,只要知道赋值改变的是等号左边的对象就行
指针比较的时候== !=比较的所存储的地址值
void *指针是特殊的指针,可以存储任意对象的地址,但我们不能直接操作这个指针指向的对象,以为不知道他是什么类型,不知道可以进行那些操作
即使是int
p, q; *也只是修饰p而已
指向指针的指针:因为指针本身是内存中的对象,所以他也有地址int *p = &i; int **o = &p;
可以画像链表一样的框框图来理解多重指针
不能有只想引用的指针,但可以有对指针的引用int *p; int *&r = p;对复杂的指针或引用的声明语句可以从离变量名从近到远的方式,这里r是个引用,r是指向指针的引用,r是指向int指针的引用

3、const
const:const对象一旦创建后他的值就不能改变了,因此必须要初始化
const int p = get_size()也可以,是在运行时初始化 如果用一个对象去初始化另一个对象,那他们是不是const都可以,常量特征旨在执行改变ci的操作时才会发挥作用,其他时候可以当作没有常量
可以把引用绑定在const常量上const int &i,这是常量引用(必须要有const,否则就可以通过i改变常量的值了,不能把普通引用绑定在常量上) 但对常量的引用不能用来修改他所绑定的对象
之前提到引用的类型必须与绑定的对象的类型一致,有两个例外:在初始化常量引用的时候可以用任意表达式作为初始值,即使是数值,算数式也可以,只要能转换成引用的类型就行,也可以是非常量
Const int &p = 3.14也行
如果把const绑定非const i,不能用引用改变i的值,但可以赋值等其他方式改变i的值
我们也可以有常量指针,就不能改变所指对象的值 不能用普通指针存常量地址,指向那个用const指针,其实就是我们对一个顶层const取地址,他就会变成底层const
指针类型要与所知类型一致的例外:我们可以让指向常量的指针指向非常量对象,也是这个对象的值可以改变只是不能通过常量指针改变
指向常量的引用和指针只是自以为是觉得自己指向了常量,所以不会改变对象的值,但他们本身的值可以改变,可以用自己改变自己
Const指针是指针本身的值不能被改变,而非所指向对象的值int *const i = &o;必须要初始化,声明比较复杂,可以从近往远读
指向常量的引用可被成为常量引用,但要分清指向常量的指针和常量指针
如果对象不是常量,可以通过常量指针修改对象的值
顶层const表示指针本身是常量,更一般的,指任意的对象是常量,底层const表示指针所指的对象是常量,一般的指指针和引用这类。对指针,靠右的const是顶层const,靠左的是底层const,对引用来说,都是底层const
当执行对象的拷贝时(引用不是对象,不能用这个规律),顶层const不受影响,而若是底层const,拷入拷出的对象必须具有相同的底层const资格或者两个对象的数据类型能进行转化,非常量可以转换为常量(指等号右边),反之不行。也就是能用非常量初始化底层const,反过来不行
const int i = 0, j = 1; j也是const
常量表达式是指在编译时就能得到运算结果的,字面值(数字/字符串)就是常量表达式,用常量表达式初始化的const对象也是常量表达式
可以用constexpr验证变量的值是否为常量表达式

4、auto类型
auto是让比那一起通过表达式的值推算变量的类型,因此必须要初始化
如果在一条auto语句中声明多个变量,那变量的类型要相同,因为auto只能代表一个值(注意*&只是声明符,不是数据类型)
用引用初始化的话用的其实是绑定对象的值 auto会忽略顶层const保留底层const
如果希望auto类型是顶层const,则const auto
auto类型的引用初始值中的顶层常量会自动保留

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值