当前位置:   article > 正文

第六章 6.6.1节练习 & 6.7节练习_6.1.1节练习

6.1.1节练习

练习6.52

已知有如下声明,

void manip(int, int);

double dobj;

请指出下列调用中每个类型转换的等级(参见6.6.1节,第219页)

(a) manip('a', 'z');

(b) manip(55.4, dobj);

解答:

(a) 5(字符字面转char) ->3(char转int)

(b) 5(double转int)


练习6.53

说明下列每组声明中的第二条语句会产生什么影响,并指出哪些不合法(如果有的话)

(a)

int calc(int&, int&);

int calc(const int&, const int&);

(b)

int calc(char*, char*);

int calc(const char*, const char*);

(c)

int calc(char*, char*);

int calc(char* const, char* const);

解答:

(a)(b)都是合法的。(a)的第二句是作用于常量引用,(b)的第二句是作用于常量的指针

(c)是非法的,这两句声明重复声明了int calc(char*, char*);

(c)在作为声明时,是合法的。但当两个声明都有各自的实现,则会出现重定义的情况。

测试代码:

  1. #include <iostream>
  2. int calc(char*, char*){
  3. return 1;
  4. }
  5. int calc(char* const, char* const){
  6. return 2;
  7. }
  8. int main(){
  9. std::cout << calc("a", "b") << std::endl;
  10. }

g++(gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) )的编译结果

  1. ~$ g++ test.cc
  2. test.cc: In function ‘int calc(char*, char*)’:
  3. test.cc:6:5: error: redefinition of ‘int calc(char*, char*)’
  4. int calc(char* const, char* const){
  5. ^
  6. test.cc:3:5: note: ‘int calc(char*, char*)’ previously defined here
  7. int calc(char*, char*){
  8. ^
  9. test.cc: In function ‘int main()’:
  10. test.cc:11:29: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
  11. std::cout << calc("a", "b") << std::endl;
  12. ^
  13. test.cc:11:29: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

clang++(clang version 3.8.0-2ubuntu4)的编译结果:

  1. :~$ clang++ test.cc
  2. test.cc:6:5: error: redefinition of 'calc'
  3. int calc(char* const, char* const){
  4. ^
  5. test.cc:3:5: note: previous definition is here
  6. int calc(char*, char*){
  7. ^
  8. test.cc:11:21: warning: conversion from string literal to 'char *' is deprecated
  9. [-Wc++11-compat-deprecated-writable-strings]
  10. std::cout << calc("a", "b") << std::endl;
  11. ^
  12. test.cc:11:26: warning: conversion from string literal to 'char *' is deprecated
  13. [-Wc++11-compat-deprecated-writable-strings]
  14. std::cout << calc("a", "b") << std::endl;
  15. ^
  16. 2 warnings and 1 error generated.

vs2017 

Visual C++ 2017   00369-60000-00001-AA792
Microsoft Visual C++ 2017

  1. cpp(7): error C2084: 函数“int calc(char *,char *)”已有主体
  2. cpp(4): note: 参见“calc”的前一个定义


练习6.54

编写函数的声明,令其接受两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。

解答:

int fun(int, int);

vector<int(*)(int, int)> funvec;


练习6.55

编写4个函数,分别对两个int值执行加减乘除运算;在上一题创建的vector对象中保存指向这些函数的额指针。

解答:

  1. int add(int, int);
  2. int sub(int, int);
  3. int mul(int, int);
  4. int div(int, int);
  5. vector<int(*)(int, int)> funvec{ add, sub, mul, div };

练习6.56

调用上述vector对象中的每个元素并输出其结果。

解答;

  1. #include <vector>
  2. #include <iostream>
  3. using namespace std;
  4. int Add(int a, int b){ return a + b; }
  5. int Sub(int a, int b){ return a - b; }
  6. int Mul(int a, int b){ return a*b; }
  7. int Div(int a, int b){ if (!b)return 0; return a / b; }
  8. int main(){
  9. int a = 10, b = 100;
  10. vector<int(*)(int, int)> funvec{ Add, Sub, Mul, Div };
  11. for (vector<int(*)(int, int)>::size_type i = 0; i != funvec.size(); ++i){
  12. cout << funvec.at(i)(a, b) << endl;
  13. }
  14. for (auto i : funvec){
  15. cout << i(a, b) << endl;
  16. }
  17. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/838247
推荐阅读
相关标签
  

闽ICP备14008679号