也说 std::endl

网上通常说 std::endl 与 /n 的区别是: std::endl 多一个操作 flush

看一下stl源码发现确实如此(Ostream文件里的基类,也许是为了统一处理),但实际测试后发现,/n并不是完全不刷新缓冲区

对于文件流,/n确实不会刷新,而std::endl会刷新

 

文件流测试代码如下(linux g++环境):

   

上面测试在windows下MinGW 测试结果一样

 

std::cout测试代码:

 

在windows下MinGW则都是立即显示

 

推测:std::cout时根据编译器不同,可能会有不同的处理,在linux下可以认为,'/n'与std::endl可以达到相同的效果,就是说都会刷新缓冲区,而且也许std::endl会执行两遍flush

在上面的代码基础上,我们可以为Teacher类重载operator=,使得可以直接将一个Student对象赋值给Teacher对象。代码如下: ```cpp #include <iostream> #include <string> class Person { protected: std::string name; int age; std::string addr; public: void get_value() { std::cout << "请输入姓名:"; std::cin >> name; std::cout << "请输入年龄:"; std::cin >> age; std::cout << "请输入地址:"; std::cin >> addr; } }; class Teacher : public Person { public: void display() { std::cout << "姓名:" << name << std::endl; std::cout << "年龄:" << age << std::endl; std::cout << "地址:" << addr << std::endl; std::cout << "我是教师" << std::endl; } Teacher& operator=(const Student& s) { this->name = s.name; this->age = s.age; this->addr = s.addr; return *this; } }; class Student : public Person { public: void display() { std::cout << "姓名:" << name << std::endl; std::cout << "年龄:" << age << std::endl; std::cout << "地址:" << addr << std::endl; std::cout << "我是学生" << std::endl; } }; int main() { Teacher t; Student s; s.get_value(); t = s; t.display(); return 0; } ``` 在Teacher类中,我们重载了operator=,使得可以将一个Student对象s赋值给Teacher对象t。在重载函数中,我们将s的数据成员name、age和addr分别赋值给t的对应成员,并返回一个指向t的引用。在主程序中,我们可以看到,我们仍然先创建了Teacher和Student对象t和s,然后调用s的get_value()函数获取数据,接着将s赋值给t,最后调用t的display()函数输出数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值