gpt4 book ai didi

c++ - (C++) Const-Reference 修改了吗?

转载 作者:行者123 更新时间:2023-11-30 02:19:34 26 4
gpt4 key购买 nike


我正在尝试编写一个可以执行大多数 std::string 操作的字符串类。实际上,我坚持使用“插入”功能。

template <typename T>
class string_base {
public:
...
/// INSERT FUNCTION
// len = current string length of *this
// cap = current capacity of this->raw_data
// raw_data = array which holds all characters
// DEF_ALLOC = 8192
// T = type of element (char, wchar_t, char16_t, char32_t), in my case: char
// str.data() returns the char array of the "str" parameter
// str.length() returns "len" variable of "str"

string_base<T> &insert(const string_base<T> &str, unsigned pos) {
if (pos > len || !str.length()) return *this;
unsigned o = len;
if (cap <= (len += str.length())) {
cap += (str.length() + DEF_ALLOC);
raw_data = (T *)realloc(raw_data, (cap * sizeof(T)));
}
if (pos) {
for (unsigned i = o; i >= pos; i--)
raw_data[i + str.length()] = raw_data[i];
} else {
for (unsigned i = o; i > 0; i--)
raw_data[i + str.length()] = raw_data[i];
raw_data[str.length()] = raw_data[0];
}
for (unsigned i = pos; i < (pos + str.length()); i++)
raw_data[i] = str.data()[i - pos];
raw_data[len] = 0x00;
return *this;
}
private:
T *raw_data;
unsigned len, cap;
};

typedef string_base<char> string;
typedef string_base<wchar_t> wstring;
typedef string_base<char16_t> string16;
typedef string_base<char32_t> string32;

正如我们所见,该函数将参数作为常量引用(据我所知,该参数不能被函数更改)我这样调用函数:

string_base<char> a("Roses are red"); // assign "Roses are red" to a's char array
string_base<char> b("not ");
//a.insert(b, 10); -> this works correctly
a.insert(a, 10); // when I pass "a", it does shit

我在位置 10 处将“a”插入到“a”中
“a”(它是字符数组)现在的值应该是“Roses are Roses are redred”。
相反,它的值是“Roses are Roses are Roses”。
我可能需要补充一点,函数本身工作正常,我只是对这个 const 引用有问题...

我认为“插入”函数也会修改传递的参数,但它不应该。
有什么办法可以预防或解决这个问题吗?

提前致谢!我希望我的问题足够清楚。

最佳答案

您不能通过对常量的引用来修改对象。但这并不意味着您不能通过其他引用修改该对象。

作为一个简单的例子,下面是完全有效的并且会打印“100”:

int main() {
int i = 42;
int& ri = i;
const int& cri = i;

ri = 100;
std::cout << cri;
}

通过 ri 所做的更改会通过 cri 反射(reflect)出来,因为它们都引用同一个对象。

你调用a.insert(a, 10)也是同样的情况。 strthis 都引用同一个对象。您对当前对象所做的任何更改也将通过 str 反射(reflect)出来。这意味着当您在重新分配的缓冲区中移动字符时,您正在修改将要复制的数据。

关于c++ - (C++) Const-Reference 修改了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50690929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com