C++Prmer第五版课后习题答案(6)

6-27

#include<iostream>

void sum(std::initializer_list<int> i1){
    int sum=0;
    for(auto beg=i1.begin();beg!=i1.end();++beg){
        sum+=*beg;
    }
    std::cout<<sum<<std::endl;
}

int main(){
    sum({1,2,3,4,5,6,7});
}

6-28
const string &
6-29
应该,声明成引用类型,能够避免实参的复制,提高效率。

6-30

#include<iostream>
#include<string>

using std::string;

bool str_subrange(const string &str1,const string &str2){
    if(str1.size()==str2.size())
        return str1==str2;
    auto size=(str1.size()<str2.size())? str1.size():str2.size();

    for(decltype(size) i=0;i!=size;i++){
        if(str1[i]!=str2[i])
            return;
    }
}

int main(){
    string str1="123",str2="34";
    std::cout<<str_subrange(str1,str2);
    return 0;
}

编译器输出如下

.\p6-30.cc: In function 'bool str_subrange(const string&, const string&)':
.\p6-30.cc:13:13: error: return-statement with no value, in function returning 'bool' [-fpermissive]
             return;
             ^~~~~~

6-31
什么情况下返回的引用是无效的:返回局部对象的引用是无效的。
什么情况下返回常量的引用是无效的:当对函数的返回对象进行赋值时,返回常量的引用是无效的
6-32
合法
6-33

#include<iostream>
#include<vector>

void output(std::vector<int> a){
    if(!a.empty()){
        std::cout<<a.back()<<std::endl;
        a.pop_back();
        output(a);
    }
}

int main(){
    output({1,2,3,4,5,6,7,8,9});
    return 0;
}

6-34
如果factorial函数的停止条件如下,将发生什么情况?
if(val!=0)
这将导致当输入的val为负数时将一直递归,会因为递归函数调用次数过多而发生程序栈溢出。使得程序无法继续执行。当val为大于0的正数时和原来的输出值一样。当val等于0时将返回1。
6-35
在factorial(val–)表示先执行factorial(val),然后val=val-1。
6-36

string (&func(string (&arrStr)[10]))[10]

6-37

using ArrT = string[10];
ArrT& func1(ArrT& arr);

auto func2(ArrT& arr) -> string(&)[10];

string arrS[10];
decltype(arrS)& func3(ArrT& arr);

6-38

decltype(odd) &arrPtr(int i)
{
    return (i % 2) ? odd : even;
}

6-39
重载函数:同一作用域内的函数名字相同但形参列表不同。
(a)错误,因为一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开
(b)错误,形参列表相同
©正确,形参列表不同,同一作用域内的函数名字相同
6-40
(a)正确。
(b)错误。一旦函数的某个参数被赋予了默认参数值,那么后面的参数都应该赋予默认参数值。
6-41
(a)错误,ht应该提供实参。
(b)正确
©正确,但是wd会被赋予’*’。
6-42

#include<iostream>
#include<string>

using std::string;

string make_plural(size_t ctr,const string &word,const string &ending="s"){
    return (ctr>1) ? word+ending : word;
}

int main(){
    std::cout<<make_plural(1,"success")<<std::endl;
    std::cout<<make_plural(2,"failure")<<std::endl;
    return 0;
}

6-43
(a)将其放入到头文件中,这个是内联函数。
(b)将其放入到头文件中,即使是普通函数,放入到头文件中也是好的。
6-44

inline bool isShorter(const string &s1,const string &s2){
    return s1.size()<s2.size();
}

6-45
一般来说,内联函数用于优化规模较小、流程直接、频繁调用的函数。
6-46
constexpr函数有几项规定:函数的返回类型及所有形参的类型都是字面值类型,并且函数体中必须有且只有一条return语句。其中字面值类型为算术类型,引用和指针。自定义类Sales_item,IO库,string类型都不属于字面值类型。
所以,不能。
6-47

#include<iostream>
#include<vector>

void output(std::vector<int> a){
    #ifndef NDEBUG
        std::cerr<<__func__<<a.size()<<std::endl;
    #endif
    if(!a.empty()){
        std::cout<<a.back()<<std::endl;
        a.pop_back();
        output(a);
    }
}

int main(){
    output({1,2,3,4,5,6,7,8,9});
    return 0;
}

6-48
不合理,只要有输入,则assert一直为真,无意义
6-49
候选函数:函数匹配的第一步是选定本次调用的重载函数集,集合中的函数被称为候选函数
可行函数:根据实参情况,从候选函数中挑选出能被这实参调用的函数,此次选出的函数被称为可行函数。
6-50
(a)这个调用具有二义性,不合法
(b)void f(int)
©void f(int ,int )
(d)void f(double,double)
6-51

6-52

6-53

6-54

#include<iostream>
#include<vector>

using F=int(*)(int,int);

int f(int a,int b){
    return a+b;
}

int main(){
    std::vector<F> v;
    int (*pf)(int a,int b);
    v.push_back(pf);
    v[0]=f;
    int sum=(*v[0])(1,2);
    std::cout<<sum<<std::endl;

    return 0;
}

6-55

#include<iostream>
#include<vector>

using F=int(*)(int,int);

int addition(int a,int b){
    return a+b;
}

int subtraction(int a,int b){
    return a-b;
}

int multiplication(int a,int b){
    return a*b;
}

int division(int a,int b) {
    if(b==0){
        return 0;
    }else{
        return a/b;
    }
}

int main(){
    std::vector<F> v;
    int (*p1)(int a,int b);p1=addition;
    int (*p2)(int a,int b);p2=subtraction;
    int (*p3)(int a,int b);p3=multiplication;
    int (*p4)(int a,int b);p4=division;
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);

    return 0;
}

6-56

#include<iostream>
#include<vector>

using F=int(*)(int,int);

int addition(int a,int b){
    return a+b;
}

int subtraction(int a,int b){
    return a-b;
}

int multiplication(int a,int b){
    return a*b;
}

int division(int a,int b) {
    if(b==0){
        return 0;
    }else{
        return a/b;
    }
}

int main(){
    std::vector<F> v;
    int (*p1)(int a,int b);p1=addition;
    int (*p2)(int a,int b);p2=subtraction;
    int (*p3)(int a,int b);p3=multiplication;
    int (*p4)(int a,int b);p4=division;
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    
    int r1=p1(1,2);std::cout<<r1<<std::endl;
    int r2=p2(2,1);std::cout<<r2<<std::endl;
    int r3=p3(2,2);std::cout<<r3<<std::endl;
    int r4=p4(2,1);std::cout<<r4<<std::endl;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值