C++ 常量静态方法修改值
我正在试验C++ 常量静态方法修改值,c++,constants,C++,Constants,我正在试验const关键字,并试图从中获得一种有用的方法 #include <iostream> class A { public: static const void modify(float& dummy) { dummy = 1.5f; } }; int main(int argc, char* argv[]) { auto a = 49.5f; A::modify(a); std::cout << a <
const
关键字,并试图从中获得一种有用的方法
#include <iostream>
class A
{
public:
static const void modify(float& dummy)
{
dummy = 1.5f;
}
};
int main(int argc, char* argv[])
{
auto a = 49.5f;
A::modify(a);
std::cout << a << std::endl;
return(0);
}
#包括
甲级
{
公众:
静态常量无效修改(浮动和虚拟)
{
假人=1.5f;
}
};
int main(int argc,char*argv[])
{
自动a=49.5f;
A::修改(A);
标准::cout
您声明的方法不是const
。它返回一个const void
(不管是什么),但它本身不是const
-方法
如果它被宣布
void modify(float& dummy) const
它可能是一个const方法,但它仍然可以修改参数的值,因为const方法可以这样做。它唯一不允许做的事情是修改它所属类的成员的值
请注意,为了声明const
方法,我必须删除static
规范。static
方法永远不能是const
,因为静态方法无论如何都不能修改任何成员
如果要防止函数修改其参数,必须使参数为常量:
static void modify(const float& dummy)
为了说明const方法可以做什么和不能做什么,下面是一个具有成员和const函数的类:
class A
{
float my_member;
public:
void modify(float& dummy) const
{
my_member = dummy; // attempt to modify member -> illegal
dummy = 1.5f; // modifies a non-const argument -> ok
}
};
如您所见,它不能修改成员,但可以修改其参数的值。如果要防止出现这种情况,需要将参数设置为常量:
class A
{
float my_member;
public:
void modify(const float& dummy) const
{
my_member = dummy; // attempt to modify member -> illegal
dummy = 1.5f; // attempt to modify a const reference -> illegal
}
};
您误解了“const”在这种情况下的作用以及它的运行方式
首先,C++中的静态成员函数不能是const。你所显示的函数返回一个“const虚”类型(这是否合理,编译器是否应该警告是另一个主题)。
您正在更改的第二个参数不是常量。如果“modify”不是静态函数,并且函数上有一个“const”修饰符,则仍可修改dummy:
void modify_nonstatic(float &dummy) const
{
dummy = 1.5f; // perfectly fine - dummy isn't a member of
// the class and can be modified
}
如果希望参数为常量,请将参数设置为常量:
static void modify(const float &dummy)
{
dummy = 1.5f; // fail! you can't modify a const.
}
void modify_nonstatic(const float &dummy)
{
dummy = 1.5f; // fail! you can't modify a const.
}
嗯,我不知道你可以将const
应用于void
。实际上你指的是静态const-void-modify(const-float&dummy)?在这种情况下,您不能修改dummy@chris我如何编写一个类似的方法来保持参数不变?为什么我没有得到警告?嘿,看看我从GCC得到了什么:警告:函数返回类型[-Wignored qualifiers]上忽略类型限定符@billz是的,但我怀疑的是在方法本身的类型中使用const。因此,第4点是该方法和所有无效方法的唯一解决方案?不,它是为了防止参数修改。@user1802174,它是每个函数的唯一解决方案。返回类型与此无关。@chris我确信使用const可以在保险箱里,这可能不是…我知道,我并不困惑;在标准中不定义“const void”的特殊情况是很有意义的。但这并不意味着编译器不应该警告类似的事情,即使严格来说,它是“符合标准的”.谢谢,不幸的是,由于我的名声不好,我无法提高投票率,但这是一个很好的回答,谢谢。不用担心,这不是提高投票率的问题,而是问题和答案的问题。