在函数c ++中通过引用传递的指针参数

Posted

技术标签:

【中文标题】在函数c ++中通过引用传递的指针参数【英文标题】:pointer parameter passed by reference in a function c++ 【发布时间】:2019-01-06 18:31:08 【问题描述】:

我有一个类模板,它有一个成员变量std::vector<T> buffer 和一个成员函数setData 等等。

template <class T>
void ArrayT<T>::setData(const std::vector<T> * & data_ptr)     
    buffer.assign(data_ptr->begin(), data_ptr->end());

我希望setData 对作为其参数传递的数据执行深层复制。如你所见,参数是* &amp;类型,如果我理解得很好,它是一个通过引用传递的指针参数。

当我写作时:

vector<float> vec(3, 1.0);
vector<float>* vec2 = &vec;
A obj();
obj.setData(vec2);

我收到一个错误:

E0434 “const std::vector> *&” 类型的引用(非 const 限定)不能用“std::vector> *"

有人能解释一下如何解决这个问题吗?

【问题讨论】:

@JesperJuhl 有很多理由这样做。但是,它们在这里都不明显。 【参考方案1】:

setData() 的输入参数是对指向 const std::vector 的非常量指针的引用。但是您指向的std::vector 对象不是const

在这种情况下根本没有理由使用指针。将 setData() 更改为通过 const 引用获取 std::vector

template <class T>
void ArrayT<T>::setData(const std::vector<T> &data)

    buffer.assign(data.begin(), data.end());
    // or simply: buffer = data;

vector<float> vec(3, 1.0);
Array<float> obj;
obj.setData(vec);

话虽如此,如果要保留指针,则需要删除const

template <class T>
void ArrayT<T>::setData(std::vector<T> * data_ptr)

    buffer.assign(data_ptr->begin(), data_ptr->end());
    // or simply: buffer = *data_ptr;

或者至少将const 移动到* 之后,以使指针本身成为const,而不是它指向的对象:

template <class T>
void ArrayT<T>::setData(std::vector<T> * const data_ptr)

    buffer.assign(data_ptr->begin(), data_ptr->end());
    // or simply: buffer = *data_ptr;

无论哪种方式,请注意我删除了引用。当您不修改指针指向的内容时,没有充分的理由通过引用传递指针。而是按值传递指针。

【讨论】:

如果我将指针保留在参数类型中,是否有解决方案?还是它错了,我一定要删除它? 谢谢!我想我现在理解得更好了

以上是关于在函数c ++中通过引用传递的指针参数的主要内容,如果未能解决你的问题,请参考以下文章

在python中通过引用传递引用

在 C++ 中通过引用传递时参数的默认值

在 C 中通过引用传递字符串

MQL4编程—值传递和引用传递

如何在 Ruby 中通过引用传递?

如何在php中通过引用传递无限参数[重复]