C++ Token_stream类中istream引用成员is未初始化可运行原因咨询
class Token_stream { public: Token get(); // get a Token void putback(Token t); // put a token back void ignore(char c); // discard characters up to and including a c Token_stream(istream& ii) : is{ii} { } private: bool full { false }; // is there a Token in the buffer? Token buffer {'0'}; // here is where putback() stores a Token istream& is; };
你的判断完全正确。istream&是C++的引用类型,必须在初始化阶段就绑定到一个已存在的合法对象,不存在未绑定就能正常工作的情况,这个类的设计刚好保证了这一点:
- 该类没有提供无参构造函数,创建
Token_stream实例时必须传入一个istream类型的左值引用参数(比如标准输入cin、自行打开的文件输入流ifstream对象等),作为构造函数的形参ii。 - 构造函数的成员初始化列表
: is{ii}会在实例初始化阶段,直接把私有成员is绑定到你传入的istream对象上,在整个Token_stream实例的生命周期内,is都会始终指向该输入流对象,不会出现空引用的问题。
额外注意:你传入的
istream对象的生命周期必须长于对应的Token_stream实例,否则is会变成悬空引用,后续调用类方法操作is时会触发未定义行为。
内容的提问来源于stack exchange,提问作者yaelreshet11
相关产品推荐
相关产品推荐

