本文共 2951 字,大约阅读时间需要 9 分钟。
练习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)在作为声明时,是合法的。但当两个声明都有各自的实现,则会出现重定义的情况。
测试代码:
#includeg++(gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) )的编译结果int calc(char*, char*){ return 1;}int calc(char* const, char* const){ return 2;}int main(){ std::cout << calc("a", "b") << std::endl;}
~$ g++ test.cc test.cc: In function ‘int calc(char*, char*)’:test.cc:6:5: error: redefinition of ‘int calc(char*, char*)’ int calc(char* const, char* const){ ^test.cc:3:5: note: ‘int calc(char*, char*)’ previously defined here int calc(char*, char*){ ^test.cc: In function ‘int main()’:test.cc:11:29: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] std::cout << calc("a", "b") << std::endl; ^test.cc:11:29: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]clang++(clang version 3.8.0-2ubuntu4)的编译结果:
:~$ clang++ test.cc test.cc:6:5: error: redefinition of 'calc'int calc(char* const, char* const){ ^test.cc:3:5: note: previous definition is hereint calc(char*, char*){ ^test.cc:11:21: warning: conversion from string literal to 'char *' is deprecated [-Wc++11-compat-deprecated-writable-strings] std::cout << calc("a", "b") << std::endl; ^test.cc:11:26: warning: conversion from string literal to 'char *' is deprecated [-Wc++11-compat-deprecated-writable-strings] std::cout << calc("a", "b") << std::endl; ^2 warnings and 1 error generated.
vs2017
Visual C++ 2017 00369-60000-00001-AA792
Microsoft Visual C++ 2017cpp(7): error C2084: 函数“int calc(char *,char *)”已有主体cpp(4): note: 参见“calc”的前一个定义
练习6.54
编写函数的声明,令其接受两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。
解答:
int fun(int, int);
vector<int(*)(int, int)> funvec;
练习6.55
编写4个函数,分别对两个int值执行加减乘除运算;在上一题创建的vector对象中保存指向这些函数的额指针。
解答:
int add(int, int);int sub(int, int);int mul(int, int);int div(int, int);vector练习6.56funvec{ add, sub, mul, div };
调用上述vector对象中的每个元素并输出其结果。
解答;
#include#include using namespace std;int Add(int a, int b){ return a + b; }int Sub(int a, int b){ return a - b; }int Mul(int a, int b){ return a*b; }int Div(int a, int b){ if (!b)return 0; return a / b; }int main(){ int a = 10, b = 100; vector funvec{ Add, Sub, Mul, Div }; for (vector ::size_type i = 0; i != funvec.size(); ++i){ cout << funvec.at(i)(a, b) << endl; } for (auto i : funvec){ cout << i(a, b) << endl; }}
转载地址:http://swqlb.baihongyu.com/