我有以下代码用于测试const成员函数: 当我有数据成员的const限定符时,它编译并运行正常 char *数据和构造函数的参数。但是,如果我从中删除const 数据成员和构造函数,我得到编译器错误。 是因为字符串“Hello World”始终是const char *?
类型#include <iostream>
#include <string.h>
using namespace std;
class mystring {
const char *data;
mutable int length;
mutable int valid;
public:
mystring(const char *str) {data = str;}
~mystring() { };
int GetLength() const;
};
int mystring::GetLength() const
{
if (valid)
return length;
else {
length = strlen(data);
valid = 1;
return length;
}
}
int main()
{
const char *str = "Hello World";
mystring s(str);
cout << s.GetLength() << endl;
}
答案 0 :(得分:3)
如果从构造函数中删除const
,它会告诉调用者它希望将char*
作为参数,并可能更改指针末尾的char
。
因为您正在使用const char*
构造mystring,所以编译器会引发错误以帮助确保您的代码执行预期的操作。
答案 1 :(得分:2)
当您想要const char*
作为参数时,您正尝试使用char*
构建一个mystring。没有强制转换,你不能从const转到非const。
答案 2 :(得分:1)
是的,C ++中的字符串文字属于const char *
类型。
要将其视为char *
,您需要执行const_cast<char*>(str)
。这可能是一个坏主意 - 修改字符串文字会导致未定义的行为。
答案 3 :(得分:1)
如果从构造函数参数和数据成员中删除const
,则代码将无法编译,因为传递给构造函数的参数str
被声明为const char *
。它完全与"Hello World"
字面无关。您可以使用str
而不是0
初始化"Hello World"
,但代码仍然无法编译。
字符串文字"Hello World"
的类型为const char[12]
。但是,语言规则允许将字符串文字转换为char *
类型,这意味着如果您将对象初始化为
mystring s("Hello World");
即使从构造函数参数和数据成员中删除了const
,代码也可以正常编译。但是一旦你将中间变量str
扔进图片"Hello World"
就变得无关紧要了。 "Hello World"
是什么并不重要。只有str
才是重要的。