字符串文字的const限定符

时间:2011-02-17 23:05:03

标签: c++ string const

我有以下代码用于测试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;
}

4 个答案:

答案 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才是重要的。