C++ 一个C++;编译器是否检测到非常量函数体?

C++ 一个C++;编译器是否检测到非常量函数体?,c++,compilation,compiler-construction,C++,Compilation,Compiler Construction,无意中发现了以下代码: class Person { private: char name[10]; public: // this won't compile: char* getName_1() const { return name; } // this will: const char* getName_2() const { return name; } }; 我想知道编译器究竟如何判断getN

无意中发现了以下代码:

class Person
{
private:
    char name[10];
public:
    // this won't compile:
    char* getName_1() const {
        return name;
    }
    // this will: 
    const char* getName_2() const {
        return name;
    }
};

我想知道编译器究竟如何判断
getName_1()
不是常量函数。因为函数体中没有实际修改成员变量的代码。

因为
getName_1
被标记为
const
这个类的所有字段都被视为const

所以
getName_1
name
的类型是
const char[10]

这无法隐式转换为
char*
(返回类型),因此编译器报告错误。

getName_1()
是一个常量方法,因为它在声明中被字面上标记为
const
。这意味着它的隐式
指针是
常量
,因此
名称
成员被视为
常量
,因此
getName_1()
无法返回指向常量数据的非常量指针,这就是它无法编译的原因。

作为其他(正确)答案的补充,它编译:

class Person
{
private:
    char* name;
public:
    // this compiles:
    char* getName_1() const {
        return name;
    }
};

比任何东西都更重要的是,这表明与流行的神话相反,C++中的数组是“强”>“不”/“强”指针。< / P>我没有问题。code>getName_1()是一个

const
函数。你所说的编译器告诉或不告诉是什么意思?这个问题还不清楚。也许你想访问这个页面@NathanOliver是的,但是没有一段代码试图修改数组
名称
——只返回其地址。到目前为止,我的思路是,在每个
const
函数中,每个成员都被视为
const
成员,因此无法修改,但显然还有更多……在每个const函数中,每个成员都被视为const成员,因此无法修改,这就是它的jist。你为什么认为还有比这更重要的事?编写器抱怨您使用了
char*
作为
getName\u 1
的返回类型。不能这样做,因为在常量函数中,
name
const char[]
,而不是
char[]
。明白了。这仅仅是因为不允许从
const char*
转换为
char*
。您能展开吗?!这听起来很有趣,但我不太明白其中的道理。这里没有特别的道理<成员函数上的code>const修饰符将所有成员视为
const
,因此
name
变为
char*const name
。没有什么可以阻止您创建另一个非常量指针,并将常量指针的值
name
分配给它。