C++类成员函数返回值与参数的结构体作用域语法疑问
类嵌套类型在成员函数声明与定义中的语法规则疑问
在阅读《C++ Primer Plus》时遇到一个关于类嵌套类型的语法问题,相关代码如下:
类定义代码
class AcctABC { private: string fullName; long acctNum; double balance; protected: struct Formatting { std::ios_base::fmtflags flag; std::streamsize pr; }; const std::string & FullName() const {return fullName;} long AcctNum() const {return acctNum;} Formatting SetFormat() const; void Restore(Formatting & f) const; public: AcctABC(const std::string & s = "Nullbody", long an = -1, double bal = 0.0); void Deposit(double amt) ; virtual void Withdraw(double amt) = 0; double Balance() const {return balance;}; virtual void ViewAcct() const = 0; virtual ~AcctABC() {} };
成员函数定义代码
AcctABC::Formatting AcctABC::SetFormat() const { Formatting f; f.flag = cout.setf(ios_base::fixed, ios_base::floatfield); f.pr = cout.precision(2); return f; } void AcctABC::Restore(Formatting & f) const { cout.setf(f.flag, ios_base::floatfield); cout.precision(f.pr); }
可以看到,SetFormat函数定义时返回类型前需加AcctABC::,但声明中无需添加;Restore函数的参数为Formatting&,定义时却不需要AcctABC::限定。以下是该语法规则的原因:
类内部声明时的作用域自动生效
类的成员声明(包括函数声明)处于类的作用域范围内,编译器处理类内部代码时,默认会搜索当前类的嵌套类型、成员等,因此直接写Formatting就能被识别为当前类的嵌套结构体,不需要额外的作用域限定。类外部定义时的作用域解析顺序
成员函数写在类外部时,编译器按从左到右的顺序解析代码:- 对于返回类型:它位于
AcctABC::SetFormat之前,此时编译器还未进入AcctABC的作用域,无法识别未限定的Formatting,必须用AcctABC::Formatting明确指定该类型属于AcctABC类的嵌套结构。 - 对于参数列表和函数体:当编译器解析到
AcctABC::Restore(...)时,已经进入了AcctABC的作用域,此时可以直接使用类内的嵌套类型Formatting,无需再添加AcctABC::限定。
- 对于返回类型:它位于
内容的提问来源于stack exchange,提问作者WindnlesszzZ
相关产品推荐
相关产品推荐

