LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 792|回复: 7

函数声明

[复制链接]
发表于 2004-8-21 22:03:10 | 显示全部楼层 |阅读模式

  1. #include <iostream>
  2. using namespace std;

  3. class location {
  4. private:
  5.   [color=red] int x, y, val;  //问题1[/color]
  6. public:
  7.    void init (int=0, int=0);
  8.   [color=red] void value_x (int val) {x=val;};  //问题2[/color]
  9.    int value_x () {return x;};  //line 10
  10.    void value_y (int val) {y=val;};
  11.    int value_y () {return y;};
  12. };

  13. void location::init (int init_x, int init_y) {
  14.    x=init_x;
  15.    y=init_y;
  16. }

  17. int main () {  //line 20
  18.    location a, b;
  19.    a.init();
  20.    a.value_x(5);
  21.    cout<<a.value_x()<<endl<<a.value_y()<<endl;
  22.    b.init(6,2);
  23.    b.value_y(4);
  24.    cout<<b.value_x()<<endl<<b.value_y()<<endl;
  25. }

复制代码

问题一:
假如:
int x, y, val;
为int x, y;
就会出错,为什么?
void value_x (int val) {x=val;};
这句中不是有定义(int val)吗?

问题二:
谭浩强的《C语言程序设计》中说:
函数原型的一般形式为:

(1)函数类型 函数名 (参数类型1, 参数类型2......);
(2)函数类型 函数名 (参数类型1 参数名1, 参数类型2 参数名2......);

    第(1)种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第(2)种形式。但编译系统下不检查参数名,因此参数名是什么都无所谓。
可我觉得并不是参数名是什么都无所谓。
比如说,如果
void value_x (int val) {x=val;};
这句为:
void value_x (int) {x=val;};
那效果就不同。

谢谢。
发表于 2004-8-21 22:24:40 | 显示全部楼层
重新看一下讲变量作用域的部分就理解了
发表于 2004-8-22 02:18:22 | 显示全部楼层

回复: 函数声明

最初由 Xiangbuilder 发表
问题二:
谭浩强的《C语言程序设计》中说:
函数原型的一般形式为:

(1)函数类型 函数名 (参数类型1, 参数类型2......);
(2)函数类型 函数名 (参数类型1 参数名1, 参数类型2 参数名2......);

    第(1)种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第(2)种形式。但编译系统下不检查参数名,因此参数名是什么都无所谓。
可我觉得并不是参数名是什么都无所谓。
比如说,如果
void value_x (int val) {x=val;};
这句为:
void value_x (int) {x=val;};
那效果就不同。

The following code is not function prototype:

  1. void value_x(int val) { x = val; }
复制代码


It is function definition. A function prototype looks like this:

  1. int x;

  2. /* function prototype */
  3. void value_x(int parameter);

  4. int main(int argc, char *argv[])
  5. {
  6.     return 0;
  7. }

  8. /* function definition */
  9. void value_x(int val)
  10. {
  11.     x = val;
  12. }
复制代码
发表于 2004-8-22 09:25:24 | 显示全部楼层
第一个问题:
去掉val的声名在cygwin gcc3.3.1下编译通过。
 楼主| 发表于 2004-8-23 15:44:34 | 显示全部楼层
第一个问题:
我是用fedora1中系统自带的g++编译的。
提示说val没有声明。
可函数定义中不是声明了吗?
那个函数是public的啊?
发表于 2004-8-23 15:54:18 | 显示全部楼层

  1. bash-2.05b$ ./test.exe
  2. 5
  3. 0
  4. 6
  5. 4
  6. bash-2.05b$
复制代码

没问题啊!
发表于 2004-8-23 16:17:09 | 显示全部楼层
在fc2 g++3.3.3上没问题
这个代码很简单,怎么会有问题?不解!
 楼主| 发表于 2004-8-23 18:02:12 | 显示全部楼层
最初由 yangtou 发表
在fc2 g++3.3.3上没问题
这个代码很简单,怎么会有问题?不解!


刚才我又试了一次,和你的结论是一样的。
应该是上次编译时我做错了什么东西。
老毛病了。
非常抱歉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表