提问:数组的[]中能否直接放入变量?

C++中简单的类型对于已经有了一定C语言知识打底的小伙伴们来说其实并没有什么区别,因此这里不大费周章介绍它们,而是直接进入复合类型专题。
数组算是进入这个专题最先见到的老朋友了,不过如果只有C语言里已经涉及的知识的话,显然并不能体现出区别,因此这里再加点料,让我们先看下面一段代码:

嗯?这不就是简单的数组初始化么?但是,=怎么不见了?系统没有报错?
没错,=可以省略了,这就是C++11标准下的列表初始化功能。先前加上=的写法早被收入了C++98标准下,而C++11作为它的进阶,自然要有些独到之处。当然,使用C++11标准的写法也有限制,这个限制被称为缩窄转换,也就是长度更长、精度更高的类型赋值给精度更低的类型,例如你将float类型值赋给了int数组或者变量,C++11标准是严格禁止这种行为的。若是编代码用不习惯这种写法也不必强求,按照之前的方式便好,这一点C++还是很自由的。
前面我说过,C++面向对象的特点之一就是可以在运行阶段进行决策,所以仅仅只是上述这些的话,数组也还是那个数组,只是初始化方式有些变化罢了,真正体现C++独到之处的是它提供了可以替换数组的模板类vector。
这里暂时不深究模板类是啥,这会在后面内容提到,现在让我们来简单看看这vector的妙处:

首先,vector被包含在vector文件中,使用前要记得把文件包含进来。
其次,根据这一小段代码不难看出vector类创建时的语法格式:vector<type_name> vt(n)。<>中填写的是后面包含变量的类型,而vt则是程序员取的vector对象的名称,至于()中的n,其实可有可无,因为vector对象会自动根据之后插入的值调整长度,即使不添加n,长度也会先默认为0。
不难看出,模板类vector比数组要更为灵活,你想要往里面塞多少成员取决于你在编写代码时需要用到多少,而不是一开始就决定好后造成可能的空余,导致空间的浪费。
当然,谈到数组还有一个绕不开的话题------字符串。
基于C语言风格下的字符串可以看作是特殊的char数组,初始化时既可以用{}加上''的形式一个字符一个字符的打,也可以直接用""一气呵成,这些C++都有继承,并在此基础上做了延伸。
C++在使用cout进行字符串输出时允许字符串字面值地拼接。如果字符串太长,并不一定需要另起一行再用cout进行输出代码编写,而是可以灵活地用多个""将整个字符串分部断开,然后按回车将它们放到下面几行,这么做的效果和直接放在一行的没有区别,阅读起来也更加一目了然,具体可见下图代码:

有cout自然也有cin,但是C++的cin特性是遇到空白(包括空格、换行符等)就会停止读入,意味着每次只能读取一个单词,这样很容易会出现明明输入了两个单词并进行输出,但是第二个单词却没有显示的情况,如下图:

可以看到,当输入name时,明明有两个单词,并且下面还要输入food,但是执行时直接跳过了输入food的操作,转而将名字的第二个单词当作food进行了输出。
那如何解决这样的问题呢?
前面说过,cin是一个类对象,那么它自然可以调用类中的成员,而类相比于结构的一大特点就是它的成员可以是函数,这里解决面向行的问题时就用到了getline()函数,见下图代码:

可以看到,getline调用的方式和结构很像,都是用"."串联两个部分,()中填写的是上面的name数组以及长度。在使用getline之后,很明显可以将多个单词同时输入了,这是因为getline每次读取一行,并将键盘输入的换行符作为结尾判定,但并不会保留换行符,这样即使下面仍然有cin输入,cin也不会接收到缓冲的换行符从而停止输入。
除了getline()函数,类中的get()也有同样效果,不过它会保留换行符,因此一般可以按照下图代码使用:

代码中使用了get函数两种可用方式,不带任何参数的形式的get()可以读取下一个字符,因此用来处理换行符,它和带参的get函数可以分开写,也可以像第二种那样用"."连着写,这是因为带参数的get最后还是返回了一个对象,相当于用返回的对象再次调用了一次无参的get函数。
细心的小伙伴应该发现了,代码中使用了相同名称的函数,但是编译器并没有报错,这涉及到C++函数重载的重要概念,这会留到后面讲。
不过说来说去,上述的这些还是C语言风格下的内容,字符数组虽然可以不去数应放入[]中的字符个数,但是若要实现字符串之间的复制、接尾等操作还要调用其他的函数例如strcpy()、strcat()等辅助实现,受数组本身特性的局限,用起来其实并没有那么方便。
好在C++为我们使用字符串提供了更加便捷的方式,那就是string类,不过由于还没讲类的概念,所以这里就简单介绍一下。
在包含string文件后,string类对象在声明时可作为简单变量,初始化方式和普通变量也没有太大差别,如下图:

作为简单变量,基础的赋值和运算符操作(例如加法就是字符串之间的拼接)自然可以进行,这在数组中是无法实现的。
即使是最基础的复合类型,C++都有着与C语言不同的地方,那放到指针上,又会有什么新的火花出现呢?