【问题标题】:const qualifier for a string literal字符串文字的 const 限定符
【发布时间】:2011-02-17 23:05:02
【问题描述】:

我编写了以下代码来测试 const 成员函数: 当我有数据成员的 const 限定符时,它编译并运行良好 char *data 和构造函数的参数。但是,如果我从中删除 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;
}

【问题讨论】:

  • 去掉const限定的时候,是不是也把mainstr的声明去掉了?
  • 最初我将 str 声明为 mystring s = "Hello World";
  • mystring s = "Hello World" 将与您的代码完美编译,即使您删除 const 如您在问题中描述的那样。此外,当您遇到“编译器错误”问题时,您必须发布您遇到的确切错误。这里没有人是心灵感应的。

标签: c++ string constants


【解决方案1】:

如果您从构造函数中删除const,它会告诉调用者它希望将char* 作为参数,并且可能会更改指针末尾的char

因为您正在使用 const char* 构造 mystring,所以编译器会引发错误以帮助确保您的代码执行预期的操作。

【讨论】:

    【解决方案2】:

    当它想要一个char* 作为它的参数时,你试图用一个const char* 构造一个mystring。如果没有演员表,你不能从 const 转到非 const。

    【讨论】:

      【解决方案3】:

      是的,C++ 中的字符串文字属于const char * 类型。

      要将其视为char *,您需要执行const_cast&lt;char*&gt;(str)。不过,这可能是个坏主意 - 修改字符串文字会导致未定义的行为。

      【讨论】:

      • 而未定义的行为通常是由于分段错误而崩溃。
      • 首先,C++ 中的字符串字面量不是类型为const char *。 C++ 中的字符串文字类型为const char[N]。其次,C++ 语言允许 [deprecated] 将字符串文字隐式转换为类型 char *,这意味着 const_cast 无需将字符串文字视为 char *
      【解决方案4】:

      如果您从构造函数参数和数据成员中删除const,代码将无法编译,因为您传递给构造函数的参数str 被声明为const char *。它与 "Hello World" 字面量完全无关。你可以用0而不是"Hello World"来初始化你的str,代码还是会编译失败。

      字符串文字 "Hello World" 的类型为 const char[12]。但是,语言规则允许将字符串文字转换为 char * 类型,这意味着如果您将对象初始化为

      mystring s("Hello World");
      

      即使您从构造函数参数和数据成员中删除了const,代码也可以正常编译。但是,一旦您将中间变量 str 放入图片中,"Hello World" 就变得无关紧要了。 "Hello World" 是什么已经不重要了。只有str 才是重要的。

      【讨论】:

      • 不,我首先没有中间变量 str。我有 mystring s = "Hello World";并且数据成员或构造函数参数中没有 const,代码编译失败。
      • @avi:您在上面发布的代码将编译得非常好或者根本不注意你在做什么。如果您真的收到来自mystring s = "Hello World" 的错误 - 请发布真实代码,因为您在上面发布的内容是假的。
      • #include #include using namespace std;类 mystring { 字符 * 数据;可变的 int 长度;可变 int 有效;公共: mystring(char *str) {data = str;} ~mystring() { }; int GetLength(); }; int mystring::GetLength() { if (valid) return length;否则 { 长度 = strlen(数据);有效 = 1;返回长度; } } int main() { mystring s("Hello World"); cout
      • @avi:我尝试过的每个编译器都可以很好地编译这段代码。你想用什么编译器?
      猜你喜欢
      • 2011-05-20
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2013-01-12
      相关资源
      最近更新 更多