1、C++Primer课后习题解答(第1-18章完整答案)完整版:http://wenku.baidu.com/link?url=-q7Mevb0O47ao7e73K3LR5Rnv-pOD4YLkwsl6vVhb9gYpfpYE8xDa9OuYLhdwFRQlumx_9XpCgTKQhoQoiCCk3A22LlyHYx51viv313vSCG
2、浮点字面值不能带后缀U。
3、
下面两个定义是否不同?有何不同? int month = 9, day = 7; int month =09, day = 07;
如果上述定义有错的话,那么应该怎样改正呢?
【解答】
这两个定义不同。前者定义了两个int 型变量,初值分别为9 和7;后者也定义了两个int 型变量,其中day 被初始化为八进制值7;而month 的初始化有错:试图将month 初始化为八进制值09,但八进制数字范围为0~7,所以出错。可将第二个定义改为:int month =011, day = 07;
4、auto为关键字。
int ival = ival; //虽然语法上没有错误,但这个初始化没有实际意义,ival 仍是未初始化的。
double salary = wage = 9999.99; //非法:同一定义语句中不同变量的初始化应分别进行。改为:double salary = 9999.99, wage = 9999.99;
5、extern std::string name("exercise 3.5a"); //定义了std::string 变量name,并将name 初始化为"exercise 3.5a",但这个语句只能出现在函数外部(即,name 是一个全局变量)。
6、int cnt = 0; const int sz = cnt; //合法
7、int ival = 1.01; //合法,将一个double 型字面值赋给int 型变量ival,发生隐式类型转换,ival 得到的值为1。
int &rval1 = 1.01; //非法。因为rval1 是一个非const 引用,非const 引用不能绑定到右值,而1.01 是一个右值。可改正为:int &rval1 = ival;(假设ival 是一个已定义的int 变量)。
const int &rval3 = 1; //合法
ival = rval3; //将int 值1 赋给变量ival
8、定义表示下列类型的类的数据成员: 电话号码
电话号码 class Tel_number
{
public:
//...对象上的操作
private:
std::string country_number;
std::string city_number;
std::string phone_number;
};
9、定义通常应放在头文件中,用常量表达式初始化的const变量也应该放在头文件中。
10、什么是默认构造函数?
【解答】
默认构造函数(default constructor)就是在没有显弅提供初始化弅时调用癿构造函数。它由丌带参数癿构造函数,或者为所有形参提供默认实参癿构造函数定义。如果定义某个类癿发量时没有提供初始化弅,就会使用默认构造函数。如果用户定义癿类中没有显弅定义仸何构造函数,编译器就会自动为该类生成默认构造函数,称为合成癿默认构造函数(synthesized default constructor )。
11、解释 string 类型癿输入操作符和 getline 函数分别如何处理空白字符。
【解答】
string 类型癿输入操作符对空白字符的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中)。
getline 函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在 string对象中)。
12、列出三种定义 vector 对象癿方法,给定 10 个元素,每个元素值为 42。指出是否还有更好的实现方法,并说明为什么。
方法一:
vector<int> ivec(10, 42);
方法二:
vector<int> ivec(10);
for (ix = 0; ix < 10; ++ix)
ivec[ix] = 42;
方法三:
vector<int> ivec(10);
for (vector<int>::iterator iter = ivec.begin();iter != ivec.end(); ++iter)
*iter = 42;
方法四:
vector<int> ivec;
for (cnt = 1; cnt <= 10; ++cnt)
ivec.p ush_back(42);
方法五:
vector<int> ivec;
vector<int>::iterator iter = ivec.end();
for (int i = 0; i != 10; ++i) {
ivec.insert(iter, 42);
iter = ivec.end();
}
各种方法都可达到目的,也许最后两种方法更好一些。它们使用标准库中定义的容器操作在容器中增添元素,无需在定义 vector 对象时指定容器的大小,比较灵活而且不容易出错。
13、如果采用下面的方法来计算 mid 会产生什么结果?
vector<int>::iterator mid = (vi.begin() + vi.end())/2;
【解答】
将两个迭代器相加的操作是未定义的,因此用这种方法计算mid 会出现编译错误。
14、解释下面每个 bitset 对象包含的位模式:
(b) bitset<32> bv(1010101);
(c) string bstr ; cin >> bstr ; bitset<8> bv(bstr);
【解答】
(b) bv 有 32 个二进制位,(位编号从 0 开始)第 0、 2、 4、5、7、8、11、13、14、16、17、18、19 位置为 1,其余位置均为 0。因为十进制数 1010101 对应的二进制数为 000000000000011110110100110110101。
(c) bv 有 8 个二进制位,(位编号从 0 开始)用读入的字符串的从右至左的 8个字符对 bv 癿 0~7 位进行初始化。
15、考虑这样的序列 1,2,3,5,8,13,21,并初始化一个将该序列数字所对应癿位置设置为 1 的bitset<32>对象。然后换个方法,给定一个空的bitset 对象,编写一小段程序把相应的数位设置为 1。
【解答】
bitset<32>对象的初始化:
bitset<32> bv(0x20212e)
方法二:
bitset<32> bv;
int x = 0, y = 1, z;
z = x + y;
while (z <= 21) {
bv.set(z);
x = y;
y = z;
z = x + y;
}
注意,设置为 1 的数位的位编号符合斐波那契数列的规律。