宁夏新闻网

首页 > 正文

「C++ Primer plus 习题」第十八章复习题

www.mahalosurfing.com2019-09-09
类Z200 {private: int j; char ch; double z; public: Z200(int jv,char chv,zv): j(jv),ch(chv),z(zv){} .}; double x=8.8; std: string s='支持效果!'; int k(99); Z200 zip(200,'Z',0.675); std: vectorai(5); int ar [5]={3,9 ,4,7,1}; for(auto pt=ai.begin(),int i=0; pt!=ai.end(); ++ pt,++ i)* pt=ai [i];

Z200类{private: int j; char ch; double z; public: Z200(int jv,char chv,zv): j(jv),ch(chv),z(zv){} .}; double x {8.8}; std: string s {'什么是支撑效果!'}; int k {99}; Z200 zip {200,'Z',0.675}; std: vectorai {3,9,4,7,1}; #include using namespace std; double up (double x){return 2.0 * x;} void r1(const double& rx){cout< void r2(double& rx){cout< void r3(Dost double&& rx){cout< int main(){double w=10.0; R1(W); R1(W + 1); R1(向上(W)); R2(W); r2(w +1); R2(向上(W)); R3(W); R3(W + 1); R3(向上(W)); return 0;}

R1(w)是合法的,形式参数rx指向wr1(w + 1),形式参数rx指向临时变量,并且该变量初始化为w + 1; r1(up(w))是合法的,形式参数rx是临时变量,该变量初始化为up(w)的返回值。通常,将左值传递给const左值引用参数时,参数将初始化为左值。将rvalue传递给函数时,const lvalue引用参数将指向rvalue的临时副本。 R2(w)是合法的,并且形式参数rx指向wr2(w + 1)非法,因为w + 1是rvalue。 r2(up(w))是非法的,因为up(W)的返回值是rvalue。通常,当将左值传递给非const左值引用参数时,参数将初始化为左值;但是非const左值参数不能接受rvalue参数。 R3(w)是非法的,因为右值参考不能指向左值(例如w)。 R3(w + 1)是合法的,rx指向表达式w + 1的临时副本r3(向上(w)),并且rx指向临时返回值up(w)。 #include using namespace std; double up(double x){return 2.0 * x;} void r1(const double& rx){coout<<'const double& rxn';} void r1(double& rx){cout<< 'double& rxn';} int main(){double w=10.0; R1(W); R1(W + 1); R1(向上(W)); return 0;}

答案:

#include using namespace std; double up(double x){return 2.0 * x;} void r1(double& rx){coout<<<'double& amp; rxn';} void r1(double&& rx){cout<< 'double&& rxn';} int main(){double w=10.0; R1(W); R1(W + 1); R1(向上(W));返回0; }

答案:

#include using namespace std; double up(double x){return 2.0 * x;} void r1(const double& rx){coout<<'const double& rxn';} void r1(double&& rx){cout<< 'double&& rxn';} int main(){double w=10.0; R1(W); R1(W + 1); R1(向上(W)); return 0;}

A.double& rxconst double& rxconst double& rx对nvalue参数w匹配的非const左值引用。另外两个参数是rvalues,const lvalue引用可以指向它们的副本。 B.double& rxdouble&& rxdouble&& rx左值引用与左值参数w匹配。 rvalue引用与两个rvalue参数匹配。 C.const double& rxdouble&& rxdouble&& rxconst左值引用与左值参数w匹配,而rvalue引用与两个右值参数匹配。简而言之,非const lvalue参与左值实值匹配,非const rvalue scrub可以匹配rvalue参数; const lvalue参数可以匹配lvalue或rvalue参数,但编译器在两种方式之前选择有限(如果可用)

b.下述简短的程序显示什么?为什么?

它们是默认构造函数,复制构造函数,移动构造函数,析构函数,复制和复制运算符以及移动赋值运算符。这些函数很特殊,因为编译器会根据需要自动提供它们的默认版本。类Fizzle {private: double bubbles [4000];};

为什么不为这个类定义移动构造函数?要使此类适合定义移动构造函数,如何修改4000个文件的更改方式?

c.下述简短的程序显示什么?为什么?

传输数据所有权(而不是复制数据)时可以使用移动构造函数,但对于标准数组,没有转移所有权的机制。如果Fizsle使用指针和动态内存分配,则可以将数据的地址分配给新指针以转移所有权。 #include templatevoid show2(double x,T& fp){std: cout<' < double f1(double x){return 1.8 * x +32;} int main(){show2(18.0,f1);返回0;}

答案:

#include #include templatevoid show2(double x,T& fp){std: cout<' < int main(){show2(18.0,[](double x){return 1.8 * x +32;});返回0;}模板void sum(std: array a,T& fp); class Adder {double tot; public: Adder(double=0): tot(q){} void operator()(double w){Tot +=w;} double tot_v()const {return tot;}}; int main(){double total=0.0;加法广告(总计); std: array temp_c={32.1,34,3,37.8,35.2,3.7};总和(temp_c,广告); total=ad.tot_v(); std: cout<< '总计:'<返回0;}模板void sum(std: array a,T&答案:

#include #include #include const int Size=5; template void sum(std: array a,T& fp); int main(){double total=0.0;加法广告(总计); std: array temp_c={32.1,34,3,37.8,35.2,3.7}; sum(temp_c,[& total](double w){total +=w;}); std: cout<< '总计:'< std: cin.get();返回0;}模板void sum(std: array a,T& fp){for(auto pt=a.begin(); pt!=a.end(); ++

热门浏览
热门排行榜
热门标签
日期归档