我们这里还是在C基础上进行对C++基础语法的补充学习!
一.C++数组
C++数组大体和C相同,但是C++数组还是有一定的区别的。
我们先看看C和C++数组共同的易错点知识:
1.数组只能一次初始化。
2.如果对数组只进行一部分初始化,那么其他未初始化的为0.
好了,下面我们就来学习C++与C不同的部分了:
与C不一样,C++初始化数组方式有了以下新的变化,当然C的方式肯定还可以用:
1、C++可以在初始化数组时,省略=,而C语言却不行。
int main()
{int arr[4]{ 1,2,3,4 };return 0;
}
但是如果是在C,会报以下错误:
2、C++可以在{}内部不加任何内容,此时表示将数组全部置空,而在C就会报错!
C语言误认为}是内容,从而报无}的错误。
3、这条是C++ Primer Plus 上的内容,说C++不能进行缩窄转换,但是我用VS2022,发现这个现在编译器可以进行了,能够进行转换,大家可以利用自己的编译器,看看是否可以做到。
二.字符串
C++存在两种字符串写法,一种是C语言的改版,另一种则是C++自身带有的写法。
下面我们对两种分别进行介绍:
2.1.C改版
我们知道在C语言中,字符串是能够拼接的,原因就在于引入了C++的字符串常量拼接规则。
注意:如果要用C的字符串相关函数,要加头文件,C:<string.h>改成<cstring>
我们知道在C++中,cin是以空白(空格,制表符和换行符)来确定字符串的结束位置,所以我们会发现,cin一次自能读取一个单词,那么如果我要的是地名,可能就会出现不完全的情况,所以我们引入下面两种新读取。
cin--面向单词的
getline/get--面向行的
我们先讲getline():
getline()读取整行,通过回车建确定结尾,有两个参数,第一个是储存行的数组的名称,第二个是读取的字符数,这要要注意,最后一个要留下给‘\0’,如果读取的是20个字符数,那么有效的只有19个,使用方法:
cin.getline(arr,20);
注意:要包含头文件<cstring>
下面我们来讲另一种:
get():
get()大体和getline相同,只有一点要注意:如果第二个参数输入20,get不会读取换行符,即20全为有效字符串,而换行符留在了队列中,如果下次读取内容,就会先读取换行符,所以如果我们使用get,一定要加一行get读取换行符,如下:
cin.get(arr,20);
cin.get();//注意:get可以不加参数
但是一直这样写,万一那次忘记了,是不是就可能出现大问题,C++给我们提供了以下写法,可以将两个类函数拼接:
cin.get(arr,20).get();
如果我们这样写是不是就不会忘记写了,这就是C++的好处,后续学习,相信你会喜欢上C++的。
既然上面两个都可以一行读取,那么我们该如何选择用哪一个呢?
下面我简单带领大家看看两种的优劣:
如果我们想知道编译器读取一行字符串是不是因为遇到换行符停下来的,这个时候,是不是就可以用get来检查了。
所以如果我们getline(),代码书写可能会简单一些,但是如果我们使用get()可以对错误进行有效检查。
上面这些都是C语言在C++的改变之处,但是C++本生自带有字符串基本类型,而且更好。
2.2.C++版
C++提供了string类,该类隐藏了字符串的数组性质,使我们能够像处理普通变量一样处理字符串。
string类使用方式如下:
1、可以使用C风格来初始化string对象
2、可以用cin来将键盘的输入存储到该数组
3、可以使用cout来显示string对象
4、可以使用数组方式访问string对象
如下:
string对象声明时开辟的空间为0,可以根据需要来调整大小,感觉是不是有点厉害。
但是远不止于此
我们在C语言中如果想要一个字符串复制给另一个字符串数组,将一个字符串数组拼接到另一个字符串数组后面,是不是需要一些函数,如:strlen()--求字符串长度,strcpy--字符串复制,strcat--拼接,但是在string,这一切都不是问题。
1.string可以直接赋值
str1=str2;//将str2的值赋值给str1
2、string可以直接拼接
str1+=str2;//将str2拼接到str1后面
3、string可以附加
str3=str1+str2;//将str1和str2的值附加给str3
求字符串长度:
在C语言中我们是用strlen来求,这个当然可以在C++使用,但是C++本身也有自己所带的函数
int len=str.size()在‘.'前边是所要求的字符串的名,返回的是int类型值。
2.3.补充
我们之前学过wchar,char16_t,char32_t这三种特殊类型,现在我们来看看此三的字符串如何表示:
其实他们大体还是和之前一样,只需要用数组表示即可
wchar_t name[]=L"hello world";
char16_t name2[]=u"hello world";
char32_t name3[]=U"hello world";
C++除了这些,还新增了原始字符串:
原始字符串用“()”作为界定符,并且用前缀R来表示原始字符串,如下:
cout<<R"(hello world)";
原始字符串的作用:
如果我们之前表示类似:\,"等是不是要加\,防止被识别为转义字符,现在在原始字符串中,可以直接写成“\等,不会被转意了。
但是有出现了下面这个问题:
如果我在字符串中需要)”同时出现时,但是我还没结束,会被认为是结束吗?
答案是:当然会,所以我们又引入了新的写法来改进该问题。
R“+*()+*”;该写法就可以避免了,看代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{cout << R"+*("(Who are you?)",she whispered.)+*" << endl;return 0;
}
结果:
以上就是本次内容,希望对你有所帮助。