自修C++PrimerPlus--类型转换、右值引用、引用中的类对象
目录
1.类型转换介绍
2.关闭vs2022的报警系统
3.string里面的I/O
4.引用和左值引用
4.1左值和右值的说明
4.2具体的代码演示
4.3字符和字符串的const区分
4.4右值引用的示例介绍
5.将引用应用于类对象
6.函数和C风格字符串
6.1两者的区别
6.2演示案例
1.类型转换介绍
我们的定义的时候两个变量都是短整型,但是相加之后的这个计算的结果却是转换成为两个int进行相加,然后把这个int类型的数据转换为这个short赋值给我们的这个folw变量,即使这个变量是short类型的,我们进行运算的时候也不会直接去使用这个short类型的数据相加,而是使用这个计算机最自然的语言:int,计算的速度很快,计算之后把这个结果转换为我们的这个接受变量的数据类型即可;
这个就是C++11标准里面添加上的这个auto声明,这个意义就是我们的这个变量的类型比较长的时候,我们就可以直接使用这个auto进行这个类型的识别,但是对于这个普通的简单的这个int类型之类的变量,我们也没有使用的这个必要;
2.关闭vs2022的报警系统
什么情况下需要关闭这个报警系统呢,就是我们的这个代码在编写的时候,这个系统的报错是因为这个编译器过于严谨造成的(有的编译器可能不会报错,这个和编译器有关)
例如下面的这个实例,我们想要把这个arr2拷贝到这个arr里面去,这个arr的大小就是20,但是这个arr如果里面的这个元素个数大于20的话,就会有潜在的风险,这个编译器就是为了安全考虑的,但是显然我们的这个地方不会出现这个问题,因此我们可以使用一行代码关闭这个地方的报警提示的功能,就是下面的这个里面的第五行代码;
3.string里面的I/O
下面的这个就是对于这个字符串和string的输入输出的一个介绍,其中这个里面的数组我们测试了两个不同的情况,就是有没有进行初始化的操作;
没有进行初始化的操作的数组,他在求解这个长度的时候就会一直向后面找,直到找到这个斜杠0为止,这个就会打印出来一个随机值,这个时候我们是没有办法猜到这个打印的结果的;
如果是进行了初始化的这个数组,我们的这个strlen求解长度的数值就是确定的;
string就不同了,没有进行初始化的时候,这个默认的设置这个string的长度就是0,因为这个string的大小是可以根据这个实际情况进行自动的调配的,这个就是string和c风格的字符串比较明显的一个区别,string的I/O实际上就是string里面的输入输出,就是介绍的这个string和字符串的一个区别
4.引用和左值引用
4.1左值和右值的说明
简单的讲,左值就是可以取地址的东西,右值就是不可以进行取地址操作的东西,下面通过几个案例进行介绍:
在上面的这个代码里面,我们的变量a是可以直接取地址的,因此这个a就可以作为引用的参数,就是作为一个变量的别名(绰号),但是像这个具体的数值,或者是字符,以及这个表达式(a+3)这种的,我们如果对于上面的这几种进行取地址的操作,就会报错,因此他们这几类是不可以进行取地址操作的,也就是说不可以作为某一个变量的引用;
我们的这个引用可以使用int&b=a,但是不可以写作int &b=10这种,凡是右值,像这个字符,表达式以及这个具体的数值,都是右值,因此就不可以出现在这个引用表达式的右边;
4.2具体的代码演示
我们的这个右值虽然不可以直接出现在我们一般的这个引用表达式里面,但是我们可以使用加上这个const进行修饰之后,上面的这个引用就可以正常使用了;
原来,我们直接在这个引用表达式的右边写上10,肯定是会报错的,因为这个10无法进行取地址的操作,也就是说这个10是右值,但是我们在这个前面加上这个const进行修饰之后,这个报错的信息就会消失;
这个实际上是因为我们加上这个const修饰之后,这个10就会赋值给一个temp临时变量,这个temp临时变量再去充当我们的引用值;
4.3字符和字符串的const区分
我们的这个const int& bb=10加上const是因为这个10本身不可以进行取地址的操作,加上const之后是为了生成temp,把临时变量这个左值作为引用;
下面的这个const string&str =" hello"这个加上const是因为我们的这个右边是常量,不可以进行修改,加上const是为了防止修改,这个hello这个字符串本身是可以取地址的;
因此,上面的两个const之间的这个作用是有区别的,我们等号右边的两个东西一个是可以取地址,一个不可以取地址,const在这两个里面的作用是不一样的;
4.4右值引用的示例介绍
就是原来不可以引用的右值,我们可以通过添加两个&&进行右值引用吗,这个也是一个语法规则,大致了解即可,后面我们会遇到这个右值引用的具体示例;
5.将引用应用于类对象
下面的这个其实就是引用的一个很简单的用法,但是这个里面可以让我们对于上面的这个知识进行综合的理解:
- 首先看到这个里面的函数的参数,两个参数都是const类型的,第一个的形参和实参都是string类型的,但是第二个参数里面的这个实参是字符串,但是形参是string,这个其实可以使用我们的上面的这个右值引用解释这个类型的不匹配的问题,一个是char*类型的字符串,一个是string类型的,这个时候加上const解决这个问题;
- 为什么加上const解决这个问题,因为加上const之后,这个就会产生一个临时的变量,其实实际上这个char*类型的字符串是可以取地址的,这个其实和上面的原理一样;
- 下面的这个程序实际上就是有问题的,因为这个自定义函数里面的这个临时变量temp出了作用域之后就会被销毁,这个时候他的引用和他无法使用同一块内存空间,因此这个程序就会崩溃;
- 正常的这个解决方法就是使用这个普通的传值返回就可以避免了;
6.函数和C风格字符串
6.1两者的区别
下面的这个文字说明了c风格字符串和char数组的区别,就是有没有斜杠0作为结束标志;
如果使用char*,我们可以使用这个循环。判断语句控制这个过程,直到遇到空值字符为止;
6.2演示案例
- 这个地方的函数参数是n,但是表示的是元素的个数,我们在这个末尾要加上\0,因此动态开辟的空间的大小就是n+1的大小;
- 我们的这个ps是一个char*类型的,可以理解为是一个数组,一次打印的时候是ps打印;
- while循环里面是先判断,再减减,最后是对于这个pstr[0]进行赋值,注意这个终止条件的判断;