C++高手请进~~~void f(int a)和void f(const int a)
答案:6 悬赏:0 手机版
解决时间 2021-11-18 02:06
- 提问者网友:鼻尖触碰
- 2021-11-17 15:15
C++高手请进~~~void f(int a)和void f(const int a)
最佳答案
- 五星知识达人网友:轮獄道
- 2021-11-17 16:55
因为这两个函数的参数类型都是一样的。不同的是前者是一个变量。后者是一个常量。const只是一个修饰符,在传参的时候,比如 f(5),那么这个时候编译器就不知道调用哪一个了。因为这两个都符合调用;
函数重载的条件是:作用域+返回类型+函数名+参数列表 这几个条件不能完全相同;否则就不能算重载只能算是重复定义。追问5在C++编译器中是const int类型的~~~所以应该调用f(const int a)啊,为什么会是重复定义呢?追答但是f(5)同时也符合f(int a)啊,这样编译器就不知道该调用谁了。当然会出错啦
值传递和地址传递是有区别的
补充:
用const 修饰函数的参数
如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。const 只能修饰输入参数:
如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy 函数:
void StringCopy(char *strDestination, const char *strSource);
其中strSource 是输入参数,strDestination 是输出参数。给strSource 加上const修饰后,如果函数体内的语句试图改动strSource 的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
例如不要将函数void Func1(int x) 写成void Func1(const int x)。同理不要将函数void Func2(A a) 写成void Func2(const A a)。其中A 为用户自定义的数据类型。
对于非内部数据类型的参数而言,象void Func(A a) 这样声明的函数注定效率比较底。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数void Func(A &a) 存在一个缺点:
“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。
以此类推,是否应将void Func(int x) 改写为void Func(const int &x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
函数重载的条件是:作用域+返回类型+函数名+参数列表 这几个条件不能完全相同;否则就不能算重载只能算是重复定义。追问5在C++编译器中是const int类型的~~~所以应该调用f(const int a)啊,为什么会是重复定义呢?追答但是f(5)同时也符合f(int a)啊,这样编译器就不知道该调用谁了。当然会出错啦
值传递和地址传递是有区别的
补充:
用const 修饰函数的参数
如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。const 只能修饰输入参数:
如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy 函数:
void StringCopy(char *strDestination, const char *strSource);
其中strSource 是输入参数,strDestination 是输出参数。给strSource 加上const修饰后,如果函数体内的语句试图改动strSource 的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
例如不要将函数void Func1(int x) 写成void Func1(const int x)。同理不要将函数void Func2(A a) 写成void Func2(const A a)。其中A 为用户自定义的数据类型。
对于非内部数据类型的参数而言,象void Func(A a) 这样声明的函数注定效率比较底。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数void Func(A &a) 存在一个缺点:
“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。
以此类推,是否应将void Func(int x) 改写为void Func(const int &x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
全部回答
- 1楼网友:狂恋
- 2021-11-17 21:03
这两个函数是重载的关系追问不是重载,编译器认为是重复定义~~~追答这两个函数的形参类型和个数是一样的,所以编译器认为是重复定义
- 2楼网友:零点过十分
- 2021-11-17 19:34
因为函数名都是f,并且都只有一个参数,当然是同一个啊追问有个东西叫函数重载~~~追答你在楼上的"void f(int a)和void f(char a)就OK啊~~~"是肯定的啊,因为函数名虽然都是f,凡是参数一个是int,一个是char,所以编译器会认为是不同的函数追问那现在一个参数是int,一个参数是const int,应该也是不同的函数啊,为什么编译器会认为重复定义?追答但是加上const 只是多了一个常量修饰,但是本质上是一样的啊
- 3楼网友:怀裏藏嬌
- 2021-11-17 19:27
void f(int a)括号里面的是形参,跟函数作用、内容有关,但跟函数类型无关,f是该函数的名字,只能声明一次,因此f(int a)与f(float b)是属于同一个函数,就像系统声明cin是输入,你就不能再声明它输出,追问有个东西叫函数重载~~~你应该去看看追答哦,那就只有linux0510说得较充分啦,谢谢你教会我新东西
- 4楼网友:梦中风几里
- 2021-11-17 18:03
c标准规定,同一模块里,变量名和函数名不能重用。
否则的话,我们写
void * w = f ;
那w到底是哪个函数的地址那?!追问有个东西叫函数重载~~~void f(int a)和void f(char a)就OK啊~~~
否则的话,我们写
void * w = f ;
那w到底是哪个函数的地址那?!追问有个东西叫函数重载~~~void f(int a)和void f(char a)就OK啊~~~
- 5楼网友:woshuo
- 2021-11-17 17:46
因为函数调用时 有2 义性,无法从 参数类型 和 参数个数 作区分。
例如 f(1) 和 f(2) , 调用 f(int a) 还是 f(const int a)?
所以是 重复定义函数。
重载,要能区分 参数类型 和 参数个数。追问那为什么f(int *a) 还是 f(const int *a)是重载(已经测试过)?追答*a 是指针,编译器认为 能区分 参数类型 和 参数个数 就允许。
--
f(1) 和 f(2) , 调用 f(int a) 还是 f(const int a)?你不能区分,编译器也不能区分。追问1或者2在C++编译器中是const int类型的~~~所以应该调用f(const int a)~~~表示能区分
例如 f(1) 和 f(2) , 调用 f(int a) 还是 f(const int a)?
所以是 重复定义函数。
重载,要能区分 参数类型 和 参数个数。追问那为什么f(int *a) 还是 f(const int *a)是重载(已经测试过)?追答*a 是指针,编译器认为 能区分 参数类型 和 参数个数 就允许。
--
f(1) 和 f(2) , 调用 f(int a) 还是 f(const int a)?你不能区分,编译器也不能区分。追问1或者2在C++编译器中是const int类型的~~~所以应该调用f(const int a)~~~表示能区分
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯