赞
踩
练习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)在作为声明时,是合法的。但当两个声明都有各自的实现,则会出现重定义的情况。
测试代码:
- #include <iostream>
-
- 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++ test.cc
- test.cc:6:5: error: redefinition of 'calc'
- int calc(char* const, char* const){
- ^
- test.cc:3:5: note: previous definition is here
- int 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++ 2017
- cpp(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<int(*)(int, int)> funvec{ add, sub, mul, div };
调用上述vector对象中的每个元素并输出其结果。
解答;
- #include <vector>
- #include <iostream>
-
- 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<int(*)(int, int)> funvec{ Add, Sub, Mul, Div };
- for (vector<int(*)(int, int)>::size_type i = 0; i != funvec.size(); ++i){
- cout << funvec.at(i)(a, b) << endl;
- }
- for (auto i : funvec){
- cout << i(a, b) << endl;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。