理解char*-C++; 我现在正在编写C++代码,我有一个两难的问题。

理解char*-C++; 我现在正在编写C++代码,我有一个两难的问题。,c++,constants,C++,Constants,编辑:我添加了与类相关的定义 \u fullName在类中定义为私有dm(char\u fullName) 我的类包含下面的getter方法: char* getFullName() const { return this->_fullName; } 但是,在过去的案例中,我使用const(const char*)返回char*。 我可以将getter方法更改为以下方法: const char* getFullName() const { return this->_full

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


  • \u fullName在类中定义为私有dm(char\u fullName)
我的类包含下面的getter方法:

char* getFullName() const { return this->_fullName; }
但是,在过去的案例中,我使用const(const char*)返回char*。
我可以将getter方法更改为以下方法:

const char* getFullName() const { return this->_fullName; }
两个版本都在编译中,但我不知道如何选择。 我会选择第二个版本,但我想知道为什么连没有const的版本也在编译?当我删除const关键字时,它是否应该给出一个错误,因为该函数是一个const成员函数,因此dms也是const,没有const关键字就无法返回???

这是与类别相关的定义:

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

首先了解附加到成员函数的
const
的含义。它确定用于成员的隐式
this
的常量。鉴于此:

struct S
{
    char value[10];

    const char *mfn() const { return value; }
};
最惠国待遇
的范围内,隐含的
常数*
。此外,其中对成员的所有引用也是
const
。在这种情况下,这意味着
value
,因为表达式表示是
const char(&)[10]
,然后再附加任何进一步的转换

这很重要

在上面的正确示例中,有一个自动转换为临时指针的过程,因为
const char(&)[10]
无异议地转换为
const char*
。但是,以下操作将失败:

struct S
{
    char value[10];

    char *mfn() const { return value; }
};
这将失败的原因很简单,因为不可能进行转换<请记住,代码>值是
常量字符(&)[10]
,只能隐式转换为
常量字符*

但它怎么可能成功呢?嗯,考虑一下:

struct S
{
    char *ptr;

    char *mfn() const { return ptr; }
};
这会奏效的。原因很微妙,但只要你仔细想想,就会明白
ptr
是一个
char*
。将
const
附加到
this
使得
char*const&
,而不是
const char*&
(有一个区别;前者是对可变数据的不可变指针的引用,后者是对不可变数据的可变指针的引用)。由于
return ptr
没有变异
ptr
(或对象中的任何其他内容),因此它是可行的


简言之,在您的情况下,它是有效的,因为您返回的指针不是通过常量参考底图的隐式转换来实现的;它只是一个值。

在您的
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返回的两个指针正常。它是复制的指针,而不是被指向的对象。指向的内存与该类无关

关于您问题的答案:有一条经验法则是尽可能多地应用const-这有助于向其他用户显示您的意图,并从编译器警告/错误中获益,如果用户试图以您不希望的方式使用您的类。因此,在本例中,传回一个
常量char*


注意:在这里查看此答案以了解更多详细信息:

您不能简单地返回std::string吗?顺便说一句,从const方法返回非const值没有问题。@CodeLearner我不确定这是否有意义。您能显示
\u fullName
-是
char
还是
char*
?-如果它只是一个返回类型为char*或const char*的字符,你就不能返回全名-你必须返回类型char或返回
&这个->\u全名
这就是我希望看到的:不
常量
有效,所有
常量
有效,混合
常量
无法编译。您的编译器可能有一些扩展,允许对
char
进行特殊处理时的旧代码进行扩展。这是否回答了您的问题?