C++ Primer 中文版(第 5 版)练习解答合集
自己写的解答,如有错误之处,烦请在评论区指正!
-
a.
int &r = 0;
不合法,不能用字面值初始化引用;
b. 只要i2
是int
类型或者const int
类型就合法;
c. 合法,r
是一个常量引用;
d. 只要i2
是int
类型或者const int
类型就合法;
e. 只要i2
是int
类型或者const int
类型就合法;
f. 不合法,如果本意是常量引用的话,首先应该去掉第二个const
,其次常量引用必须初始化;
g. 只要i
是int
类型或者const int
类型就合法; -
a.
int *const cp;
不合法,const
类型必须初始化;
b.int *const p2;
不合法,const
类型必须初始化;
c.const int ic
不合法,const
类型必须初始化;
d. 第 2 个const
不合法,const
类型必须初始化;
e. 合法,p
是指向常量的指针,本身不是常量,所以不初始化也可以。 -
a. 合法;
b. 不合法。p1
是一个普通指针,而p3
的第一个const
表明这是个指向常量的指针;(要是合法的话就有可能通过p1
修改一个常量的值,显然这是不允许的)
c. 不合法。p1
是一个普通指针,ic
是const
对象;
d. 合法。不能再把p3
指向别的对象,同时也不能通过p3
修改ic
的值;
e. 不合法。p2
本身是const
对象,初始化之后不能修改其值;
f. 不合法。ic
是const
对象,初始化之后不能修改其值。
对象名 | 顶层 / 底层const |
---|---|
v2 | 顶层 |
p2 | 底层 |
p3 | 同时是顶层和底层 |
r2 | 底层 |
语句 | 说明 |
---|---|
r1 = v2; | 不合法。普通的int& 不能绑定到const int 上。 |
p1 = p2; | 不合法。p2 具有底层const ,而p1 没有。 |
p2 = p1; | 合法。int* 可以转换成const int* ,但是不能通过p2 修改其指向的值。 |
p1 = p3; | 不合法。p3 具有底层const ,而p1 没有。 |
p2 = p3; | 合法。都具有底层const 。 |
-
非法。改为
*p = nullptr;
或者*p = 0;
a = 42; // 合法
b = 42; // 合法
c = 42; // 合法
d = 42; // 错误,d 是整型指针
e = 42; // 错误,e 是指向整型常量的指针
g = 42; // 错误,g 是对常量的引用
- 见 33
变量名 | 变量类型 |
---|---|
i | const int |
j | int |
k | const int& |
p | const int* |
j2 | const int |
k2 | const int& |
变量名 | 变量类型 | 程序结束时的值 |
---|---|---|
a | int | 4 |
b | int | 4 |
c | int | 4 |
d | int& | 4 |
变量名 | 变量类型 | 值 |
---|---|---|
a | int | 3 |
b | int | 4 |
c | int | 3 |
d | int& | 3 |
-
decltype
和auto
的区别:
a.auto
计算变量初始值来判断类型,而decltype
直接分析表达式而不计算其值;
b.auto
会忽略顶层const
,而decltype
不会;
c.decltype ((variable))
的结果永远是引用,且如果decltype
分析的表达式是赋值的话会生成左值类型的引用。 -
[Error] expected ';' after struct definition
struct Sales_data {
std::string ISBN;
std::string book_type;
unsigned units_sold;
unsigned units_remain;
double revenue;
};
-
略
-
略