我正在使用外部库中的函数(此处由printer
-function表示)。
我注意到,偶然地,我可以const
像print()
-function一样通过成员函数传递类成员。即使我使用
g++ -Wall -Wextra -Wpedantic -Werror -o test test.cpp
我没有得到一个错误。
这似乎是非常错误的,因为实际上我正在通过调用const
成员函数来修改对象。为什么编译器不抱怨?这是代码:
#include <iostream>
using namespace std;
void printer(void* data) {
static_cast<char*>(data)[0] = '1';
cout << static_cast<char*>(data) << endl;
}
void setUp(char* data, int length) {
for(int i=0; i<length; i++)
data[i] = '0';
data[length] = '\0';
}
class Test {
private:
char* data;
public:
Test(int length) {
data = new char(length+1);
setUp(this->data, length);
}
~Test() {
delete data;
}
void print() const {
printer(this->data);
}
};
int main() {
Test T(3);
T.print();
return 0;
}
我最好的猜测是,编译器仅保证指针变量不会被修改,即函数调用后不会指向其他物理地址。但是我也注意到,当我尝试用astd::vector<char>
代替char*
and修改后的print
-function时,编译器会抛出错误:
void print() const {
printer(this->myVector.data());
}
因此,如果我的猜测是正确的,为什么不能对data()
STL向量获得的指针做类似的事情?
您有一个char *数据成员。
在const限定方法的上下文中,这意味着该成员可能不会发生突变。
成员是指针。更改指针意味着更改其指向的位置。
需要明确的是,方法内部的有效限定类型是
char * const
而不是
const char *
这全是为了确认您绝对正确
我最好的猜测是,编译器仅保证指针变量不会被修改,即在函数调用之后不指向其他地址。
但是,对于矢量而言,您想要在具有有效限定类型的对象上调用数据std::vector<char> const&
...因此,您需要的const限定重载std::vector::data
,并返回const char*
。首先,这是您所期望的,但是它与原始指针的行为不同。
造成这种差异的原因是向量是为了表示该数据的所有权而编写的,因此const向量应具有const内容。原始指针可能拥有它们指向的数据,但是无法表达这一点,也没有办法对拥有和不拥有原始指针具有不同的const行为。这是在可能的情况下避免使用原始指针的可能原因之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句