从对象成员传递const引用。 IE someObject.function()

时间:2016-02-18 15:37:12

标签: c++ vector stl

好吧,我生锈了,或者我以前从未注意到这一点。如果以前曾经问过我,我会提前道歉,但是我找不到任何与我要求的相关的内容,或者我正在搜索错误的关键词。所以,让我谈谈这一点。当从函数IE中传递const引用值时,返回类型是vector类型的成员变量的const引用,我似乎不能使用该值。也许我只是超级生疏,用PHP和Javascript进行编程,所以我已经远离强力打字一分钟了。

但是,让我向您展示一些代码,以确定我正在谈论的内容。

#pragma once
#include <vector>
#include <string>
class VectorTest
{
   public:

    VectorTest() 
    {

        std::string test = "";

        for (char letter = 'a'; letter < 'Z'; letter++)
        {
            test.push_back(letter);
            valueToReturn_.push_back(test);
        }

     }

     const std::vector<std::string>& ReturnByConstReference()
     {
         return valueToReturn_;
     }

    ~VectorTest() {}

  private:

    std::vector<std::string> valueToReturn_;

};

为简单起见,上面是Vector测试类。现在是调用部分

 #include <vector>
 #include <iostream>
 #include <string>
 #include "VectorTest.h"

 void functionTest(const VectorTest* testItem)
 {
     std::vector<std::string> test((*testItem).ReturnByConstReference);
 }

 void functionTest(const VectorTest& testItem)
 {
     std::vector<std::string> test(testItem.ReturnByConstReference());
 }

 int main() 
 {

     VectorTest testVectorObject;

     //this works however the passing to the functions does not.
     std::vector<std::string> test(testVectorObject.ReturnByConstReference());

     functionTest(&testVectorObject);
     functionTest2(testVectorObject);

 }

好的,所以我无法弄清楚为什么vector的复制构造函数在main中工作,但如果我将对象VectorTest作为const引用传递给函数,编译器会立即抛出一个拟合。我知道我忘记了一些关于将对象作为引用传递然后尝试访问将私有成员变量作为const引用传回的函数的规则,这样我就可以避免复制的成本。

这当然是我尝试做的小规模版本,所以我理解在这个例子中副本不会那么昂贵。

我确定我忘记了为什么这不起作用以及如何让它发挥作用,所以如果有人可以刷新我的记忆,我会非常感激。

如果以前曾经问过这个问题,请再次抱歉,但我不确定要为搜索输入的字词,所以我找不到答案。也很抱歉任何缩进问题,从Visual Studio复制到这里有点烦人。

同样重申一下,复制构造函数在main中工作,当我将对象传递给包含的函数时,一切都在一边。再次感谢您的帮助,如果有任何意义,请告诉我。

1 个答案:

答案 0 :(得分:1)

您的参数说const VectorTestReturnByConstReference不是const

如果您声明main

,它也会在const VectorTest testVectorObject;中失败

创建函数const

const std::vector<std::string>& ReturnByConstReference() const