C++ primer习题笔记第1~3章

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  的数位的位编号符合斐波那契数列的规律。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值