看看以下C ++程序的输出:
-
#include<iostream>
-
-
using
namespace
std;
-
-
class Test
-
-
{
-
-
protected:
-
-
int x;
-
-
public:
-
-
Test (
int i):x(i) { }
-
-
void fun() const
-
-
{
-
-
cout <<
"fun() const called " <<
endl;
-
-
}
-
-
void fun()
-
-
{
-
-
cout <<
"fun() called " <<
endl;
-
-
}
-
-
};
-
-
int main()
-
-
{
-
-
Test t1 (10);
-
-
const Test t2 (20);
-
-
t1.fun();
-
-
t2.fun();
-
-
return
0;
-
-
}
输出:上面的程序编译并运行良好,并产生以下输出。
fun() called
fun() const called
两种方法'void fun()const'和'void fun()'具有相同的签名,除了一个是const而另一个不是。另外,如果我们仔细看一下输出,会发现在const对象上调用了“ const void fun()”,而在非const对象上调用了“ void fun()”。
C ++允许根据const类型重载成员方法。当函数返回引用或指针时,基于const类型的重载可能会很有用。我们可以使一个函数const返回一个const引用或const指针,另一个非const函数返回一个非const引用或指针。
参数呢?
与const参数有关的规则很有趣。让我们首先看下面的两个例子。程序1编译失败,但是程序2编译并运行正常。
-
// PROGRAM 1 (Fails in compilation)
-
-
#include<iostream>
-
-
using
namespace
std;
-
-
void fun(const int i)
-
-
{
-
-
cout <<
"fun(const int) called ";
-
-
}
-
-
void fun(int i)
-
-
{
-
-
cout <<
"fun(int ) called " ;
-
-
}
-
-
int main()
-
-
{
-
-
const
int i =
10;
-
-
fun(i);
-
-
return
0;
-
-
}
输出:
编译器错误:重新定义“ void fun(int)”
-
// PROGRAM 2 (Compiles and runs fine)
-
-
#include<iostream>
-
-
using
namespace
std;
-
-
void fun(char *a)
-
-
{
-
-
cout <<
"non-const fun() " << a;
-
-
}
-
-
void fun(const char *a)
-
-
{
-
-
cout <<
"const fun() " << a;
-
-
}
-
-
int main()
-
-
{
-
-
const
char *ptr =
"ssss";
-
-
fun(ptr);
-
-
return
0;
-
-
}
输出:
const fun()ssss
只有当const参数是引用或指针时,C ++才允许基于参数的常数重载函数。这就是程序1编译失败,但程序2正常运行的原因。这条规则实际上是有道理的。在程序1中,参数“ i”按值传递,因此fun()中的“ i”是main()中“ i”的副本。因此fun()无法修改main()的“ i”。因此,接收“ i”作为常量参数还是普通参数都没有关系。当我们通过引用或指针传递时,我们可以修改引用或指向的值,因此我们可以有两个版本的函数,一个可以修改引用或指向的值,另一个不能。
作为练习,预测以下程序的输出:
-
#include<iostream>
-
-
using
namespace
std;
-
-
void fun(const int &i)
-
-
{
-
-
cout <<
"fun(const int &) called ";
-
-
}
-
-
void fun(int &i)
-
-
{
-
-
cout <<
"fun(int &) called " ;
-
-
}
-
-
int main()
-
-
{
-
-
const
int i =
10;
-
-
fun(i);
-
-
return
0;
-
-
}
以上就是今天的全部内容了。每日分享小知识,希望对你有帮助~
另外如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!笔者这里或许可以帮到你~
C语言C++编程学习交流圈子,QQ群:765803539【点击进入】微信公众号:C语言编程学习基地
分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习视频分享:
转载:https://blog.csdn.net/qq_42366672/article/details/116542917