1

我知道范围解析运算符::用于识别和消除不同范围中使用的标识符。

在此处提供的示例中,C++ 定义类成员结构并在成员函数中返回它

class UserInformation
{
public:
    userInfo getInfo(int userId);
private:
    struct userInfo
    {
        int repu, quesCount, ansCount;
    };
    userInfo infoStruct;
    int date;
};

您可以创建一个返回嵌套类类型的成员函数userInfo

UserInformation::UserInfo UserInformation::getInfo(int userId)   <-----
{
    Userinfo x;            <-----
    infoStruct.repu = 1000;
    return infoStruct;
}
  1. 为什么必须在函数定义中声明两次作用域?UserInformation::UserInfo UserInformation::getInfo(int userId)如果只声明一次是错误的,但据我了解,我认为在开始时声明一次,在返回值之前将我们置于正确的范围内?
  2. 在上面的函数中,我添加Userinfo x;以表明可以在没有范围解析运算符的情况下声明和使用嵌套类类型。为什么允许这样做?
4

2 回答 2

3
  1. 函数返回类型需要类范围,因为名称查找还不知道它。

如果您希望使用 C++11 尾随函数返回类型,则可以绕过该要求。

auto UserInformation::getInfo(int userId) -> UserInfo
{ ... }
  1. 成员函数体内不需要类作用域,因为在那里类作用域显然是已知的。
于 2019-11-14T07:44:26.850 回答
1
  1. 为什么必须在函数定义中声明两次作用域?UserInformation::UserInfo UserInformation::getInfo(int userId)

对于返回类型和函数标识符,class UserInformation都应用了外部范围(在 之外)。

  1. 在上面的函数中,我添加了 Userinfo x; 表明可以在没有范围解析运算符的情况下声明和使用嵌套类类型。为什么允许这样做?

UserInformation::getInfo()是 的成员函数class UserInformation。在函数体内部,假设有一个额外的(不可见的)参数,可以通过this(指向调用函数的实例的指针)访问。

成员函数的作用域涉及到它所属的类的作用域。这涵盖了嵌入类型以及成员变量和函数,this->如果没有被遮蔽(例如,通过具有相同标识符的局部变量),则隐式地以 () 为前缀。

于 2019-11-14T07:45:08.647 回答