为何cout << ((*i)->getFirstName());可行,其他写法却不行?
为什么只有
((*i)->getFirstName())能正常运行? 让我一步步给你拆解这个问题,搞清楚为什么只有第一种写法能正常工作,其他几个都栽了跟头~
首先先明确你的容器类型:vector<Employee *> Employees是一个存储Employee类指针的容器,迭代器i指向的是容器里的每个Employee*元素的位置。
正确写法的逻辑
cout << ((*i)->getFirstName());
这里的步骤是:
*i:解引用迭代器i,取出容器里的元素——也就是一个Employee*类型的指针。(*i)->getFirstName():通过这个指针调用Employee类的成员函数getFirstName(),完全符合C++指针调用成员的语法,所以能正常运行。
错误写法逐一分析
1. cout << Employee[*i]->getFirstName();
- 第一个致命错误:你把**类名
Employee和容器变量名Employees**搞混了!Employee是你定义的类,不是存储对象的容器,根本不能用下标[]访问。 - 就算改成
Employees[*i]也不行:*i是Employee*类型的指针,而下标操作Employees[N]需要的是整数索引(比如0、1、2),类型完全不匹配,编译器直接报错。
2. cout << Employee[i]->getFirstName();
- 同样犯了“类名和变量名混淆”的错误:
Employee是类,不是容器。 - 退一步说,就算用对了
Employees,迭代器i也不能直接当整数索引用——i是迭代器对象,不是整数,Employees[i]这种写法本身就不符合语法,编译器会直接拒绝。
3. cout << *i->getFirstName();
- 这个是运算符优先级的坑!C++里
->的优先级比*高,所以代码会被编译器解析成*(i->getFirstName())。 - 但
i是vector<Employee*>::iterator类型的迭代器,这个迭代器类根本没有getFirstName()成员函数啊!自然会编译报错。必须加括号(*i)先解引用迭代器拿到Employee*指针,再用->调用成员函数,才能保证执行顺序正确。
总结几个关键点
- 别搞混类名和容器变量名:
Employee是类,Employees是你的vector变量,大小写和拼写都要注意。 - 迭代器的本质:对于存储指针的容器,迭代器解引用后得到的是指针,不是对象实例。
- 牢记运算符优先级:
->>*,必要时用括号强制改变执行顺序。
内容的提问来源于stack exchange,提问作者The Ultraempoleon
相关产品推荐
相关产品推荐

