1-0 这里不得不提一下,本章例子中程序没有问题,但是输出的图案补胎好看,与例子上面演示结果不符,若要相符,将greeting的定义改为:
const std::string greeting = " Hello, " + name + "! ";
也就是在Hello的前面和!的后面各加上一个空格,并且删去在输出greeting中第一个*后面的空格即可。
1-1 有效,因为字符串由“ ”赋初值,字符串之间可以使用+进行组合,此处+为符号的重载。
1-2 经过测试,发现定义无效,错误原因为invalid operands to binary expression ('const char *' and 'const char *')
我将程序改为如下:
#include <iostream>
#include<string>
using namespace std;
int main()
{
const string exclam=" ! ";
const string message= "Hello"+(",world"+exclam);
cout<<message;
return 0;
}
发现可以执行。我认为是由于+在重载定义时其两边虽然可以均是字符串或字符串加字符串常量,但是中间变量不允许出现两个常量字符串相加的结果。即加号左边不允许出现"hello"+" !"的中间变量的情况,而加号右边允许出现该情况。
我觉得这个是重载定义的问题,如果更改+的定义,应该可以纠正此情况。
1-3 有效。虽然定义了两个同样的s字符串,但是这两个字符串属于不同的局部变量,分别被两对{}包含,因此相互不影响,当第一对{}结束时,里面的第一个s已经失效,编译器也不再保留第一个s。
1-4 有效。同样两个s其实属于不同的局部,第一个时大的局部,第二个是小的局部。在系统运行到小的局部时发现有同样的s需要定义,会重载一个s,即自动识别其为s[2],此s[2]在小的局部结束时自动失效。
在更改}}为};}后仍然有效。因为相当于在小的局部结束后添加了一条空语句 ;不影响整个程序的执行。
1-5 同上题一样,当x在小的局部定义时,一旦小局部结束,x这个局部变量就失效,等于不存在了,自然无法输出。若要让x输出,只需要将x的输出一行放入小局部的{}之中就可以了。
源代码:
#include <iostream>
#include<string>
using namespace std;
int main()
{
{string s="a string";
{string x=s+", really";
cout<<s<<endl;
cout<<x<<endl;}
}
return 0;
}
1-6 系统会自动以空格为间隔分开读入输入的两个字符串,并且忽略空格这个字符。即如果要输入名和姓,之间不可以有空格符,或者分开读取。