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
    评论
这是一个实现上述要求的字符串类MyString的示例代码: ```cpp #include <iostream> #include <cstring> class MyString { private: char* content; int capacity; int length; public: MyString(); MyString(int iVal); MyString(float fVal); MyString(char* s); MyString(const MyString& obj); ~MyString(); MyString operator+(char* s); MyString operator+(char c); MyString operator+(const MyString& obj); MyString operator=(char* s); MyString operator=(const MyString& obj); char operator[](int index); friend MyString operator+(char c, const MyString& obj); }; MyString::MyString() { capacity = 32; content = new char[capacity]; length = 0; } MyString::MyString(int iVal) { capacity = 32; content = new char[capacity]; length = sprintf(content, "%d", iVal); } MyString::MyString(float fVal) { capacity = 32; content = new char[capacity]; length = sprintf(content, "%f", fVal); } MyString::MyString(char* s) { capacity = 32; int sLength = strlen(s); while (capacity <= sLength) { capacity += 32; } content = new char[capacity]; strcpy(content, s); length = sLength; } MyString::MyString(const MyString& obj) { capacity = obj.capacity; content = new char[capacity]; strcpy(content, obj.content); length = obj.length; } MyString::~MyString() { delete[] content; } MyString MyString::operator+(char* s) { int sLength = strlen(s); while (capacity < length + sLength) { capacity += 32; char* newContent = new char[capacity]; strcpy(newContent, content); delete[] content; content = newContent; } strcat(content, s); length += sLength; return *this; } MyString MyString::operator+(char c) { if (capacity <= length + 1) { capacity += 32; char* newContent = new char[capacity]; strcpy(newContent, content); delete[] content; content = newContent; } content[length] = c; content[length + 1] = '\0'; length++; return *this; } MyString MyString::operator+(const MyString& obj) { int objLength = obj.length; while (capacity < length + objLength) { capacity += 32; char* newContent = new char[capacity]; strcpy(newContent, content); delete[] content; content = newContent; } strcat(content, obj.content); length += objLength; return *this; } MyString MyString::operator=(char* s) { int sLength = strlen(s); while (capacity < sLength) { capacity += 32; delete[] content; content = new char[capacity]; } strcpy(content, s); length = sLength; return *this; } MyString MyString::operator=(const MyString& obj) { if (this == &obj) { return *this; } capacity = obj.capacity; delete[] content; content = new char[capacity]; strcpy(content, obj.content); length = obj.length; return *this; } char MyString::operator[](int index) { if (index < 0 || index >= length) { std::cerr << "Index out of range!" << std::endl; return '\0'; } return content[index]; } MyString operator+(char c, const MyString& obj) { MyString result; result.capacity = obj.capacity + 1; result.content = new char[result.capacity]; result.content[0] = c; strcpy(result.content + 1, obj.content); result.length = obj.length + 1; return result; } int main() { MyString str1; // Testing default constructor std::cout << "str1: " << str1[0] << std::endl; MyString str2(123); // Testing int constructor std::cout << "str2: " << str2[0] << std::endl; MyString str3(3.14f); // Testing float constructor std::cout << "str3: " << str3[0] << std::endl; MyString str4("Hello"); // Testing char* constructor std::cout << "str4: " << str4[0] << std::endl; MyString str5 = str4; // Testing copy constructor std::cout << "str5: " << str5[0] << std::endl; str5 = " World"; // Testing char* assignment operator std::cout << "str5: " << str5[0] << std::endl; str5 = str4; // Testing MyString assignment operator std::cout << "str5: " << str5[0] << std::endl; MyString str6 = 'c' + str5; // Testing friend operator+ overload std::cout << "str6: " << str6[0] << std::endl; MyString str7 = 'd' + str5; // Testing operator+ overload std::cout << "str7: " << str7[0] << std::endl; return 0; } ``` 这个示例代码实现了MyString类,并分别测试了各个构造函数和运算符重载的功能。注意,为了简化示例,这里没有实现完整的成员函数,你可以根据需要自行扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值