如果我们有这样的函数原型:
const CString function(...)
{
CString x;
//do some stuff
return x;
}
这是否意味着该函数返回一个const CString?因为C ++中的const可以放在类中的方法前面,告诉编译器不会修改属性(或不可变)
我问这个“愚蠢”的问题,因为在另一个案例中我们可以有类似的东西:
static CString function(...)
{ }
在这种情况下,static与“function”有关,而与返回的变量无关。
答案 0 :(得分:3)
这是否意味着该函数返回一个const CString?
是的。
因为C ++中的const可以放在类中的方法前面,告诉编译器属性不会被修改(或者不可变)
不可以,{<1}}必须在方法之后放置
。const
返回 class MyClass {
// ...
const CString function();
// ...
}
的函数。
const CString
同样的事情。
class MyClass {
// ...
CString const function();
// ...
}
可以在常量对象上调用的函数,因为它“承诺”不会更改内部状态。
根据经验, class MyClass {
// ...
CString function() const;
// ...
}
总是 后声明为常量的东西......
const
的... 除了,为了向后兼容而保留。
以下两行是相同的,一个指向常量const <type>
的常量指针。请注意,要使指针保持不变,int
将落后于const
:
*
答案 1 :(得分:2)
在C ++中WHERE w.charge in (0,1,2,3)
表示你有一个返回const return_type function_name(params)
的函数。如果你有const return_type
,那么这会将该函数标记为静态,并且您不再需要该类的实例来调用此函数。如果你想将一个函数标记为static return_type function_name(params)
,这意味着它不会使类内容情绪化,那么你需要将const
放在函数之后
const
答案 2 :(得分:2)
const CString function(...)
会返回const CString
,
但它被弃用,因为很少有用,而且暂时不允许move
。因此,在CString s; s = foo();
中,副本已完成,而不是move
。
最重要的用法是禁止像
这样的事情foo() = CString(..);
C ++ 11在方法和r值引用上引入了ref限定符,允许以不同方式修复:
Obj& operator = (const Obj& rhs) & ; // Note the final &
答案 3 :(得分:1)
要从函数返回const值,请使用:
std::vector<std:vector<string>> my_vec
告诉compilater属性不会改变使用:
const CString function(...)
{
CString x;
//do some stuff
return x;
}
答案 4 :(得分:1)
声明为const CString function(...)
的函数返回const CString
。这在C ++中与在C中相同。
如果你有一个像这样定义的C ++方法:
void MyClass::function(void) cont;
这意味着方法function
不会修改对象。
答案 5 :(得分:1)
const描述了方法的返回类型的属性。 所以, const CString method_name(); 表示该方法返回一个const CString对象,即该方法的调用者无法修改的对象。
在方法描述方法本身的属性之后出现const。它告诉该方法没有&#34;变异&#34;或者&#34;修改&#34;它操作的对象。
所以, const CString method_name()const; 表示该方法不能修改用于调用该方法的对象的任何成员变量。它与方法的返回类型无关。
让我们看一下这个例子。
class Foo
{
int x;
int GetX() const {return x;}
void SetX(int i_x) {x = i_x;}
};
在上面的类定义中,GetX()是一个const方法,即不希望修改用于调用它们的对象。这是什么意思?声明一个类时,每个成员函数都有一个版本加载到内存中。此外,所有非静态成员方法都需要一个对象来调用它们。这是如何实现的?当您声明类的非静态成员方法时,C ++编译器会狡猾地更改方法的签名以期望&#34; this&#34;指针,即指向用于调用方法的对象的指针。 对于非const方法,&#34; this&#34;预期的指针是Class *。所以上面的SetX()方法如下所示: void SetX(Foo * this,int i_x){this-&gt; x = i_x;} 您可以使用this指针修改对象(x是对象的一部分!) 但是,对于const方法,&#34; this&#34;传递的指针是 const Class *即你不能使用&#34; this&#34;来修改对象。指针。所以GetX成了 int GetX(const Foo * this){return this-&gt; x; } 由于this指针的类型是const Foo *,因此无法更改指针所指向的对象,即您不能执行以下操作: x = 100; 这将转化为此 - > x = 100;编译器会抱怨的。