理解 char* - C++

4

我正在编写C++代码,现在遇到一个困境。

编辑:我添加了相关类的定义


  • _fullName 在类中被定义为私有 dm(char _fullName)

我的类包含以下getter方法:

char* getFullName() const { return this->_fullName; }

然而,我曾经遇到过这样的情况,即返回带有const修饰符的char*(const char*)
我可以将getter方法更改为以下内容:

const char* getFullName() const { return this->_fullName; }

两个版本都可以编译,但我不知道该怎么选择。 我会选择第二个版本,但我想知道为什么没有const关键字的版本也能编译?因为这是一个CONST成员函数,因此dms也是const,没有const关键字就不能返回dms吗?

这是相关类的定义:

class Professional
{
private:
    char* _ID;
    char* _fullName;
    int _age;
    char* _profession;
}

3
你不能简单地返回一个std::string吗? - Macmade
@drescherjm 但是我想要返回地址,因此使用 char* 类型... - CodeLearner
1
@CodeLearner 我不确定这是否有意义。你能展示一下 _fullName 的声明吗?它是 char 还是 char *?如果它只是一个 char,那么你不能用 char * 或 const char * 作为返回类型来返回 _fullName。你需要返回 char 类型或者返回 &this->_fullName - code_fodder
1
这是我期望看到的内容:https://godbolt.org/z/v1s9o8。没有`const`工作,所有的`const`都工作,混合使用`const`会导致编译失败。你的编译器可能有一些扩展,允许旧代码,因为在那些时代,`char`被赋予了一些特殊的处理方式。 - user4581301
显示剩余15条评论
2个回答

4

首先了解 const 修饰成员函数的含义。它决定了用于成员的隐式 thisconst 属性。给定以下内容:

struct S
{
    char value[10];

    const char *mfn() const { return value; }
};

mfn中,隐式的thisconst S *。此外,在其中获得的所有成员引用也都是const的。在这种情况下,这意味着在附加任何进一步的转换之前,value作为表达式表示是const char (&)[10]

这很重要。

在上面正确发布的示例中,会自动转换为临时指针,因为const char(&)[10]可以无异议地转换为const char*。然而,以下操作将失败:

struct S
{
    char value[10];

    char *mfn() const { return value; }
};

这将失败的原因很简单,因为没有可转换项。记住,valueconst char (&)[10]类型,只能隐式地转换为const char*类型。
但是,它为什么会成功呢?考虑下面的情况:
struct S
{
    char *ptr;

    char *mfn() const { return ptr; }
};

这将起作用。原因很微妙,但一旦你思考它就显而易见了。ptr 是一个 char*。附加到 this 上的 const 使其成为 char * const&不是 const char *&(它们之间有区别; 前者是对可变数据的不可变指针的引用,后者是对不可变数据的可变指针的引用)。由于 return ptr 没有改变 ptr(或对象中的其他任何内容),因此它可以作为结果。
简而言之,在您的情况下,它起作用是因为您返回的指针不是经过某个常量基础层的隐式转换;它只是一个值。

2

您的示例中有几个问题,比如int num成员与char *成员不同。

让我们扩展一下您的示例:

class Professional
{

    int* func() const
    {
        return &myInt; // Fails because it returns a reference to a member variable
    } 

    char* func() const
    {
        return &myChar; // Fails because it returns a reference to a member variable
    } 

    int* func() const
    {
        return pInt; // ok because it returns a COPY of the member pointer
    } 

    char* func() const
    {
        return pChar; // ok because it returns a COPY of the member pointer
    } 

    int myInt;
    char myChar;
    int *pInt;
    char *pChar;

注意:copy返回的两个指针是可以的,被复制的是指针而不是指向的对象。指向的内存与this类无关。

至于你的问题的答案:有一个经验法则是尽可能地应用常量 - 这有助于向其他用户展示您的意图,并从编译器警告/错误中获得好处,如果用户试图以您不打算的方式使用您的类。因此,在这种情况下,返回一个const char *

注意:更具体的细节请参见此答案:const int*,const int * const和int const *之间的区别是什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接