const在函数原型中

时间:2015-12-08 14:33:57

标签: c++

如果我们有这样的函数原型:

const CString function(...)
{
CString x;
//do some stuff
return x;
}

这是否意味着该函数返回一个const CString?因为C ++中的const可以放在类中的方法前面,告诉编译器不会修改属性(或不可变)

我问这个“愚蠢”的问题,因为在另一个案例中我们可以有类似的东西:

static CString function(...)
{ }

在这种情况下,static与“function”有关,而与返回的变量无关。

6 个答案:

答案 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; // ... } 总是 后声明为常量的东西......

旧的C风格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;编译器会抱怨的。