C++ 重载<<

#include <iostream>
#include <string>
using namespace std;


/************************************************************************

运算符重载 << 左移运算符

/************************************************************************/

class Person{
	//全局函数声明为该类的友元,可以访问该类的私有成员
	friend ostream & operator<<(ostream &cout, Person &per);

public:
	Person(){}
	Person(int age, int height):m_age(age),m_height(height){}

	/*1.使用成员函数重载,per.operator<<(cout) 简化为 per<<cout
	发现和正常cout<<per输出不一样,所以最好不用成员重载<<
	void operator<<(ostream cout)
	{
		cout<<this->m_age;
	}
	*/


private:			
	int m_age;	
	int m_height;
};

//使用全局函数重载<<运算符,返回对象引用,可以进行链式编程,operator<<(cout, per)简化为cout<<per
ostream & operator<<(ostream &cout, Person &per)
{
	cout<<"age:"<<per.m_age<<","<<"height:"<<per.m_height;
	return cout;
}

void test1()
{
	/* 1.使用成员函数重载<<调用,不推荐
	Person per1(10,160);
	cout<<per1;
	
	//本地调用
	//per1.operator <<(cout);
	//简化调用
	per1<<cout;
	*/

	//2.使用全局函数重载<<调用
	Person per2(20,160);
	
	//本质调用
	operator<<(cout, per2)<<endl;
	
	//简化调用,链式编程实现换行
	cout<<per2<<endl;
	
}

int main()
{

	test1();

	return 0;
}

### C++重载 `<<` 运算符 在 C++ 中,`<<` 是流输出运算符,通常用于向输出流(如标准输出 `std::cout` 或文件流)写入数据。为了使该运算符能够处理自定义类型的对象,可以通过 **运算符重载** 来实现。 #### 1. 基本原理 `<<` 运算符的重载通常是通过定义一个全局函数来完成的,这个函数接受两个参数:一个是 `std::ostream` 类型的引用(表示输出流),另一个是要输出的对象。函数返回值是一个指向 `std::ostream` 的引用,以便支持链式调用[^1]。 #### 2. 函数签名 以下是典型的函数签名: ```cpp std::ostream& operator<<(std::ostream& os, const T& obj); ``` - 参数说明: - `os`: 表示输出流对象。 - `obj`: 待输出的对象。 - 返回值:返回 `os` 引用,允许连续使用多个 `<<` 操作符。 #### 3. 实现方式 可以将 `operator<<` 定义为类的友元函数或者作为全局函数。如果将其声明为友元,则可以在函数内部访问类的私有成员变量。 ##### 示例代码 以下是一个完整的例子,展示如何为 `Person` 类重载 `<<` 运算符: ```cpp #include <iostream> using namespace std; class Person { public: // 将 operator<< 声明为友元函数 friend ostream& operator<<(ostream& os, const Person& p); Person(const string& name, int age) : name(name), age(age) {} private: string name; int age; }; // 全局函数实现 ostream& operator<<(ostream& os, const Person& p) { os << "Name: " << p.name << ", Age: " << p.age; // 使用已有的 << 对内置类型的支持 return os; // 支持链式调用 } int main() { Person tom("Tom", 25); cout << tom << endl; // 调用重载后的 operator<< Person bob("Bob", 30), jack("Jack", 28); cout << bob << " and " << jack << endl; // 链式调用 return 0; } ``` 在这个例子中,`operator<<` 被定义为 `Person` 类的一个友元函数,因此它可以访问 `Person` 类的私有成员变量 `_name` 和 `_age`[^3]。 #### 4. 关键点解析 - **返回值**: 必须返回 `std::ostream&` 类型的引用,这样才能支持像 `cout << a << b << c;` 这样的链式调用[^1]。 - **作用域**: 如果不希望暴露过多细节,可以选择将 `operator<<` 定义为全局函数而非类方法;但如果需要访问私有成员,则需将其声明为友元函数[^4]。 #### 5. 应用场景 除了基本的数据类型外,还可以为复杂结构体或类提供更直观的打印形式。例如,在时间类 (`Time`) 中,我们可以让程序以 `"HH:MM:SS"` 格式显示时间[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值