C++ 为什么const在C++;?

C++ 为什么const在C++;?,c++,C++,最近,我正在寻找一种只对map的值进行排序的解决方案,然后我发现了这段代码 template <typename T1, typename T2> struct less_second { typedef pair<T1, T2> type; bool operator ()(type const& a, type const& b) const { return a.second < b.second

最近,我正在寻找一种只对map的值进行排序的解决方案,然后我发现了这段代码

    template <typename T1, typename T2>
    struct less_second {
    typedef pair<T1, T2> type;
    bool operator ()(type const& a, type const& b) const {
        return a.second < b.second;
    }
};

map<string, int> mymap;
// …

vector<pair<string, int> > mapcopy(mymap.begin(), mymap.end());
sort(mapcopy.begin(), mapcopy.end(), less_second<string, int>());
模板
无结构秒{
typedef对类型;
布尔运算符()(const&a类型,const&b类型)const{
返回a.second

我首先想到的是,为什么在许多示例代码和解决方案中,我发现人们经常使用const关键字?这样做是一种好做法吗?如果是,为什么

为什么要使用const?

我的看法是,你应该尽可能多地使用
const
。可变值始终是错误的来源。您可以通过避免可变值来避免这些错误

C++中常量的函数

const
经常使用,因为它有很多不同的含义:

如果我们看一下这个签名,我们可以看到两种类型的const
bool操作符()(类型const&a,类型const&b)const{…}
:有一个const引用
const&a
const&b
,这意味着您不能修改作为引用传递的
a
b

方法末尾还有一个常量,这意味着该方法不会修改实例。图1是一个get方法。此方法不会修改从中获取值的实例。您可以使用
T get_元素(int at_index)const{…}
向调用者发送信号

还有更多的常量指针

在这里,您可以更改地址中的值,但不能更改地址本身:

int *const a = new int;
*a = 1; // legal
a = &var; // illegal
在这里,您可以更改指针指向的地址,但不能更改该地址中的值

const int *a = new int;
*a = 1; // illegal
a = &var; // legal
(希望我没有混淆两者)

具有不允许任何更改的指针:

const int * const a = new int;
*a = 1; // illegal
a = &var; // illegal
进一步阅读:


此外,还有一个函数,它可以在编译时计算值。这与
const
关键字不同,可能会在开始时让您感到困惑。

为什么要使用const?

我的看法是,你应该尽可能多地使用
const
。可变值始终是错误的来源。您可以通过避免可变值来避免这些错误

C++中常量的函数

const
经常使用,因为它有很多不同的含义:

如果我们看一下这个签名,我们可以看到两种类型的const
bool操作符()(类型const&a,类型const&b)const{…}
:有一个const引用
const&a
const&b
,这意味着您不能修改作为引用传递的
a
b

方法末尾还有const,这意味着该方法不修改实例。图1是一个get方法。此方法不会修改从中获取值的实例。您可以使用
T get_元素(int at_index)const{…}
向调用者发送信号

还有更多的常量指针

在这里,您可以更改地址中的值,但不能更改地址本身:

int *const a = new int;
*a = 1; // legal
a = &var; // illegal
在这里,您可以更改指针指向的地址,但不能更改该地址中的值

const int *a = new int;
*a = 1; // illegal
a = &var; // legal
(希望我没有混淆两者)

具有不允许任何更改的指针:

const int * const a = new int;
*a = 1; // illegal
a = &var; // illegal
进一步阅读:


此外,还有一个函数,它可以在编译时计算值。这与
const
关键字不同,在开始时可能会让您感到困惑。

此函数参数中的
const
允许使用
const
值调用函数(在
int
的情况下,类似
1
的值是
const
)。而且,由于参数是一个引用,
const
保证原始变量不会改变

成员函数声明后的
常量
保证调用该函数时不会修改该类的对象

因此,通过查看函数的定义,我们可以自动知道变量的类型以及我们可以使用的变量类型


同时了解这些假设,编译器可以创建更好的代码

此函数参数中的
const
允许使用
const
值调用函数(在
int
的情况下,类似
1
的值是
const
)。而且,由于参数是一个引用,
const
保证原始变量不会改变

成员函数声明后的
常量
保证调用该函数时不会修改该类的对象

因此,通过查看函数的定义,我们可以自动知道变量的类型以及我们可以使用的变量类型


同时了解这些假设,编译器可以创建更好的代码

如果你有两个完全不同的问题,那么就创造两个,不要一次问。你的第二个问题在这里得到了回答:对不起,谢谢你的链接,我现在编辑了这个问题,省略了第二部分。那么第一部分是这个问题的重复:如果目的是某些东西不会被更改,那么将它指定为
const
是有用的,并且被认为是良好的做法-它允许编译器检测(可能是无意的)试图更改它。另一种选择是,不将其标记为const
,这意味着编译器不会报告更改它的尝试-如果其他代码假定它没有更改,这可能会给您带来不愉快的惊喜。如果您有两个完全不同的问题,则创建两个,而不在一个问题中提问。您的seco