从对象成员传递常量引用.IE someObject.function()

Passing by const reference from a object member. IE someObject.function()

本文关键字:someObject IE function 引用 常量 对象 成员      更新时间:2023-10-16

好吧,我生锈了,或者我以前从未注意到这一点。如果之前有人问过这个问题,我提前道歉,但我找不到与我所问的内容相关的任何内容,或者我搜索了错误的关键字。所以让我进入正题。从函数 IE 传递常量引用值时,返回类型是 vector 类型的成员变量的常量引用,我似乎无法使用该值。也许我只是超级生疏,一直在用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_;
};

以上是为简单起见的向量测试类。 现在对于调用部分

 #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 引用传回的函数的规则,这样我就可以避免复制的成本。

这当然是我正在尝试做的一个小版本,所以我知道在这个例子中副本不会那么昂贵。

我确定我忘记了一些关于为什么这不起作用以及如何让它工作的事情,所以如果有人可以刷新我的记忆,我将不胜感激。

再次抱歉,如果这是以前问过的问题,但我不确定输入什么术语进行搜索,所以我找不到答案。也很抱歉任何缩进问题,从Visual Studio复制到这里有点烦人。

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

您的参数显示const VectorTestReturnByConstReference不是const

如果您声明main,它也会在失败const VectorTest testVectorObject;

使函数const

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