const 在这里的目的是什么?
What is the purpose of const here?
我看过以下内容:
void function_name(std::string& txt) const;
上述原型中const的作用是什么?函数的 return 类型是 void 所以没有 return 类型,对我来说它看起来完全没有意义,我已经看到了很多,在传递参数时也是如此:
void function_name(const int a);
为什么 const 会在上面添加任何东西,如果它不是指针或引用,无论如何都不能在函数中更改?
void function_name(std::string& txt) const;
const
主要意味着这是一个 const
成员函数,它不应该改变对象的状态。因此,如果函数更改任何成员变量,都会导致编译错误。
第二种情况:
void function_name(const int a);
这个 const 意味着函数不应该在它的函数体中改变变量 a
。但是请注意,对于 int
或 bool
等基本类型,不需要 const
。此外,它最有可能在 pass-by-reference 时应用(不是像这样按值传递)。
所以典型的用法更像这样:
void function_name(const some_non_trival_type& a);
据说一开始没有const
也可以。
void function_name(const int a)
{
int b = 10;
// complex things ...
std::cout<< a+b;
}
有一天有人认为换行会神奇地提高函数的性能
void function_name(const int a)
{
a = 10; // Beep! It doesn't compile.
int b = 10;
// complex things ...
std::cout<< a+b;
}
然后这个 const
在执行任何单元测试之前拯救世界。
我想说这个 const 可能有语义告诉别人“不要修改它,因为这个函数根据参数的 constness 正常工作”。
const 方法原型使您也可以将此类方法用于 const 对象,例如:
struct X
{
void function_name(std::string& txt) const {}
};
int main()
{
const X x;
std::string s{"Hallo"};
x.function_name(s); // will not work if the function is not marked as const!
}
第二种情况
void function_name(const int a);
向编译器提示您将(并且可以)永远不会更改 const 变量的内容。这允许编译器对其进行优化。如果您使用像这样的非平凡对象:
void function_name(const XYZ x);
它更有意义,因为如果它不是 const,编译器必须为该函数创建对象的完整副本。这也可能被优化掉,但在 const 的情况下,根本不需要复制,因为什么都不会改变。通过标准的聪明编译器,内部生成的代码可以等同于:
void function_name(const XYZ& x);
或
void function_name(XYZ& x);
对于给定的使用 int 的示例,它或多或少没有影响,但阐明了接口。
我看过以下内容:
void function_name(std::string& txt) const;
上述原型中const的作用是什么?函数的 return 类型是 void 所以没有 return 类型,对我来说它看起来完全没有意义,我已经看到了很多,在传递参数时也是如此:
void function_name(const int a);
为什么 const 会在上面添加任何东西,如果它不是指针或引用,无论如何都不能在函数中更改?
void function_name(std::string& txt) const;
const
主要意味着这是一个 const
成员函数,它不应该改变对象的状态。因此,如果函数更改任何成员变量,都会导致编译错误。
第二种情况:
void function_name(const int a);
这个 const 意味着函数不应该在它的函数体中改变变量 a
。但是请注意,对于 int
或 bool
等基本类型,不需要 const
。此外,它最有可能在 pass-by-reference 时应用(不是像这样按值传递)。
所以典型的用法更像这样:
void function_name(const some_non_trival_type& a);
据说一开始没有const
也可以。
void function_name(const int a)
{
int b = 10;
// complex things ...
std::cout<< a+b;
}
有一天有人认为换行会神奇地提高函数的性能
void function_name(const int a)
{
a = 10; // Beep! It doesn't compile.
int b = 10;
// complex things ...
std::cout<< a+b;
}
然后这个 const
在执行任何单元测试之前拯救世界。
我想说这个 const 可能有语义告诉别人“不要修改它,因为这个函数根据参数的 constness 正常工作”。
const 方法原型使您也可以将此类方法用于 const 对象,例如:
struct X
{
void function_name(std::string& txt) const {}
};
int main()
{
const X x;
std::string s{"Hallo"};
x.function_name(s); // will not work if the function is not marked as const!
}
第二种情况
void function_name(const int a);
向编译器提示您将(并且可以)永远不会更改 const 变量的内容。这允许编译器对其进行优化。如果您使用像这样的非平凡对象:
void function_name(const XYZ x);
它更有意义,因为如果它不是 const,编译器必须为该函数创建对象的完整副本。这也可能被优化掉,但在 const 的情况下,根本不需要复制,因为什么都不会改变。通过标准的聪明编译器,内部生成的代码可以等同于:
void function_name(const XYZ& x);
或
void function_name(XYZ& x);
对于给定的使用 int 的示例,它或多或少没有影响,但阐明了接口。