为什么我们需要在函数GetMax的开头放置const?

时间:2017-10-18 14:31:50

标签: c++

#include <iostream>
#include <string>
using namespace std;

template <typename Type>
const Type& GetMax(Type& value1,Type& value2)
{
    if(value1 > value2)
        return value1;
    else
        return value2;
}
template<typename Type>
void DisplayComparison(const Type& value1,const Type& value2)
{
    cout<<"GetMax("<<value1<<","<<value2<<") = ";
    cout<<GetMax(value1,value2)<<endl;
}
int main()
{
    int Int1 = -102, Int2 = 2001;
    DisplayComparison(Int1,Int2);

    double d1 = 3.14,d2 = 3.1416;
    DisplayComparison(d1,d2);

    string Name1("Jack"),Name2("John");
    DisplayComparison(Name1,Name2);

    return 0;
}

const Type& GetMax ... const是否必要?如果是,为什么? 如果我这样写 - &gt; const Type& GetMax(const Type& value1,const Type& value)这两个const正在做什么? :(

1 个答案:

答案 0 :(得分:0)

我将提出一些关于const的观点,以便明确何时以及可以根据需要使用哪些内容:

案例1:let zipArch = SSZipArchive(path: zippedDir.path) print(zipArch.open) print(zipArch.write(dataStr.data(using: String.Encoding.utf8)!, filename: "blah.txt", withPassword: "")) print(zipArch.close)

这里value1是本地副本,我可以想到几点

我可以想到几个原因:

1)当有人阅读代码并查看GetMax(const Type value1)时,他们知道不应在函数体中修改const Type value1

2)当您尝试修改函数体中的value1时,编译器会告诉您。因此,添加value1可以防止错误。

3)然而,C ++ 11还有另一个不同之处。当移动操作修改对象时,无法移动常量对象。因此,您只能在函数体中复制const,并且不能从中移动。

4)另外,如果这是一个类类型,则不能在const对象上调用非const成员函数。

案例2:value1

我们不知道GetMax(const Type& value1)如何在函数外部使用,因此我们希望保护它不被修改。

案例3:value1

在功能之前讨论const Type& GetMax(),意味着它会返回constconst的引用(此处为Type

举个例子:

GetMax

所以,总而言之,你不需要使用&#34; Class xyz; Type& t = xyz.GetMax() //This is INCORRECT const Type& tc = xyz.GetMax() //This is OKAY! 除非您有上述要求,但在某些情况下这样做可能是一种好习惯。