学习C++primer 第19天 之 小问题

jinjunweiruan 2008-07-21 07:33:27
1.书上有这么一句话:“候选函数是与被调函数同名的函数,并且在调用点上,它的声明可见。”

问下:“何为调用点?顺便举个例子看看不在调用点上的。”
问下:“何为声明可见?顺便举个例子看看声明不可见的。”

2. (1)void f(double,double=3.14);
(2)void f(int,int);


现在像有这么一个函数调用: f(42,2.56);

那么(1)和(2)都可以,这里会产生二义性。所以要强制一下:如下

(3)f(static_cast<double>(42),2.56);
(4)f(42,static_cast<int>(2.56));

但是,这样强制后,还是分不出来啊。如果选(3)的结果和(4)的结果不一样啊。。。怎么办...

3。书上有这么一句话:“整数对象即使具有与枚举元素相同的值也不能用于调用期望获得枚举类型实参的函数!”

为什么?
enum Tokens(INLINE =128,VIRTUAL=129);
void ff(Tokens);
int main(){
ff(128)}
这里的ff(128)传递的是一个整形,他为什么就不能和函数Tokens匹配呢?Tokens里需要传递的也是整形参数啊!!..

4.最后,我总是搞不清楚 * 这个符号再表达式中的意义。比如它有时候再名字前面,有时候再后面什么的。。不是太明白。谁有些这个资料。最好每总情况都有。
小弟感谢!!
...全文
184 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fetag 的回复:]
引用 1 楼 pengzhixi 的回复:
3、Tokens是传递的枚举类型,你没看过整型可以提升为枚举类型的吧

一楼的这句恰好说反了!
[/Quote]
多谢 过儿提醒。
wjb_yd 2008-07-21
  • 打赏
  • 举报
回复
f(0); //调用点,编译器在对这行解释的时候,还没发现下一行才第一次出现名字为f的函数声明,所以在调用点,f函数声明不可见,因为下一行才见到

void f(int);
e_sharp 2008-07-21
  • 打赏
  • 举报
回复
1. 字面意思就对了
2. 强制转换后,为了完全匹配函数声明,这样就可以调用就没有歧义了。
3. int和enum类型不一致
matrixdwy 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 steedhorse 的回复:]
楼主有点钻牛角尖了,像“调用点”“声明可见”这些词,顾名思义就可以理解的嘛。
“调用点”,就是函数被调用的地方;
“声明可见”,就是能见到函数的声明,C++语言中不允许函数尚未声明就直接调用。当然,允许声明和定义放在一起。
[/Quote]
晨星 2008-07-21
  • 打赏
  • 举报
回复
楼主有点钻牛角尖了,像“调用点”“声明可见”这些词,顾名思义就可以理解的嘛。
“调用点”,就是函数被调用的地方;
“声明可见”,就是能见到函数的声明,C++语言中不允许函数尚未声明就直接调用。当然,允许声明和定义放在一起。
古月无华 2008-07-21
  • 打赏
  • 举报
回复
呵呵,对的,小往大转换,
独孤过儿 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
3、Tokens是传递的枚举类型,你没看过整型可以提升为枚举类型的吧
[/Quote]
一楼的这句恰好说反了!
独孤过儿 2008-07-21
  • 打赏
  • 举报
回复
1.书上有这么一句话:“候选函数是与被调函数同名的函数,并且在调用点上,它的声明可见。”

问下:“何为调用点?顺便举个例子看看不在调用点上的。”
问下:“何为声明可见?顺便举个例子看看声明不可见的。”
/*
调用点就是在代码中,对函数的实际调用的那一处,比如说,声明了一个函数fun();然后在代码的某处调用了它,那个地方就叫调用点。
声明可见就是说,这个函数已经是被定义过的了,在这里调用,不会出现那种 函数未定义 的错误。例子是这样的:
int fun(int n); // 函数声明
int fun(int n, int m = 8); // 带默认参数的函数声明

fun(3, 5); // 调用点

如果把 带默认参数的函数声明去掉,那在调用点上就会报错,因为第一个fun()只有一个参数,不具有默认参数的函数行为
*/

2. (1)void f(double,double=3.14);
(2)void f(int,int);


现在像有这么一个函数调用: f(42,2.56);

那么(1)和(2)都可以,这里会产生二义性。所以要强制一下:如下

(3)f(static_cast <double>(42),2.56);
(4)f(42,static_cast <int>(2.56));

但是,这样强制后,还是分不出来啊。如果选(3)的结果和(4)的结果不一样啊。。。怎么办...
/*
强转以后,两个参数都变成了double型或者int型,就分出来调用版本了啊!结果不一样,是因为它们完全是两个函数,它们完全是两个版本的函数啊,具有不同的行为很正常啊!
*/

3。书上有这么一句话:“整数对象即使具有与枚举元素相同的值也不能用于调用期望获得枚举类型实参的函数!”

为什么?
enum Tokens(INLINE =128,VIRTUAL=129);
void ff(Tokens);
int main(){
ff(128)}
这里的ff(128)传递的是一个整形,他为什么就不能和函数Tokens匹配呢?Tokens里需要传递的也是整形参数啊!!..
/*
因为不能隐式的将int转换为枚举类型!虽然枚举类型可以当int类型来使用,但是int不能当枚举来用。像你的代码中,只有两个枚举变量,它们的值是128和129,就不能将一个整形数字赋值给这两个枚举变量,以改变它们的值,对吧!
*/

4.最后,我总是搞不清楚 * 这个符号再表达式中的意义。比如它有时候再名字前面,有时候再后面什么的。。不是太明白。谁有些这个资料。最好每总情况都有。
/*
*号没什么神秘,就下面主要的几种用法:
1、当它跟在类型后面使用的时候,表示的是声明指针,比如:int* ptr;
2、当它直接跟变量名使用,而没有类型的时候,表示的是取指针里面的内容,比如上面的*ptr
3、*还表示的是乘号的意思。比如:a = b * c;
4、第三种方法,如果是两个变量之间的相乘,并且回写,可以简写为:a *= b; 等价于 a = a * b;
*/
pengzhixi 2008-07-21
  • 打赏
  • 举报
回复
补充下第一题:还要注意一个作用域。
pengzhixi 2008-07-21
  • 打赏
  • 举报
回复
1、
void f(double,double=3.14)
void f(int,int)

f(42,2.56); //这为调用点
void f(double,double=3.14)
void f(int,int)这两个函数声明必须放在f(42,2.56); 的前面,这就是所谓的声明可见。如果放f(42,2.56); 后面就是声明不可见了。

2、f(static_cast <double>(42),2.56); 已经将42转换成了double型,所以和void f(double,double)是精确匹配,就会调用void f(double,double)

3、Tokens是传递的枚举类型,你没看过整型可以提升为枚举类型的吧
skineffect 2008-07-21
  • 打赏
  • 举报
回复
3楼的回答太详细了,学习了。
hai040 2008-07-21
  • 打赏
  • 举报
回复
对1补充个例子
void f(int,int);
f(3.1,4.2);
void f(double,double);
这里f调用的是int版本,因为double版本对于这个调用不可见
mingguang7213 2008-07-21
  • 打赏
  • 举报
回复
做程序有时需要牛角尖精神,加油吧
其实你应该多想想,不要形成问的惰性,其实你问的这些问题自己应该是能够想明白的

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧