gpt4 book ai didi

c++ - 前向声明类时成员函数的行为

转载 作者:行者123 更新时间:2023-11-30 00:44:08 24 4
gpt4 key购买 nike

当使用 C++11 编译以下代码时,它的行为符合预期。

class Student;

class University
{
vector <Student*> students;
public:
University();
void print();
};

class Student
{
string name;
public:
Student(string nom) : name(nom) {}
friend ostream& operator << (ostream& out, Student* S)
{
return out << S -> name;
}
};

University::University()
{
for (string name: {"Alice", "Bob"})
students.push_back(new Student(name));
}

void University::print() { for (auto s: students) cout << s << '\n'; }

int main()
{
University uni;
uni.print();
}

打印输出是

Alice
Bob

但是,当 print() 函数在其类声明中实现时,如下所示:

class University
{
vector <Student*> students;
public:
University();
void print() { for (auto s: students) cout << s << '\n'; }
};

打印输出变成

0x20055ff0
0x20056028

问题:为什么print()即使 Student 函数的行为也是如此已经在第一行声明了吗?

解决方案:在实现任何成员函数之前声明所有类。只要print()operator <<都是在他们的类声明之后实现的,print()即使在 operator << 之前实现,也能正常工作

最佳答案

使用 operator<< 打印指针的默认行为是打印所指向的内存地址的十六进制表示。

当执行print()在类声明里面,编译器还没有看到operator<<覆盖 Student*指针,因此它不知道它的行为应该与默认行为有任何不同。

当您定义 print() operator<< 之后的实现重写,编译器知道使用该重写而不是默认值。

关于c++ - 前向声明类时成员函数的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50053417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com