C++,重载输出操作符<<, cout.operator()是什么东东?

C++之operator operator是C++关键字之一, 称为重载运算符(也称“重载操作符”)。所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。 例如,+号可以对不同类型(int、float 等)的数据进行加法操作;<<既是位移运算符,又可以配合cout向控制台输出数据。C++本身已经对这些运算符进行了重载。C++也允许程序员自己 阅读详情

 

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

class Student
{
public:
	// 存
	void setname(string s){	name = s;}
	void setage(int y){age = y;	}
	void setaddress(string add){address = add;}    
	// 取
	string getname(){return name;}
	int getage(){return age;}
	string getaddress(){return address;}
   
	Student(string name="",int age=0,string address="")
	{
		this->name = name; this->age = age; this->address = address;      
	}
	~Student(){}

    
	 //重载 运算符<< : 把 "operator<<" 看作是函数名, 返回类型是 ostream类型的对象引用
	friend ostream& operator<< (ostream &os,Student &st)
	{
		os<<st.name<<"------"<<st.age<<"------"<<st.address<<endl;
		return os;
	}
protected:	
private:
	string name;
	int    age;
	string address;
};

void main()
{ 
Student x1("刘莉莉",22,"东风路369号"); 
 cout<<x1; 
//cout<<x1 ---结果OK,问题是这个写法很怪,是谁在调用那个重载函数?,x1显然是个参数,那是cout调用的 operator<< ? 
     

	  /*
	     "<<"  是个什么东东? C++ Prime P6
		这是个 "输出操作符", 其左边是ostream对象cout,右边是要输出的值
		它的操作返回输出流本身cout,也就是可以连续写的原因.

	   */

	  // 既然 cout是 ostream对象,那么可以用 . 的形式 访问ostream的成员函数
      // 但是 operator<< 在本程序中已经重载了,要按照本程序的形参格式传入参数 ?
       ostream z;
	   cout.operator<<(z,x1);  // 编译通不过...
}


//---

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

void main()
{ 
  cout.operator <<("csdn"); // 0046E01,是个地址? 为什么不是输出字符串"csdn"?
}


 // ---  答案.....

http://topic.youkuaiyun.com/u/20121006/15/eba3d438-2f71-4b39-b8d5-f6c4a94e3d1b.html?seed=131699817&r=79821898#r_79821898

 

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

class Student
{
public:
	// 存
	void setname(string s){	name = s;}
	void setage(int y){age = y;	}
	void setaddress(string add){address = add;}    
	// 取
	string getname(){return name;}
	int getage(){return age;}
	string getaddress(){return address;}
	
	Student(string name="",int age=0,string address="")
	{
		this->name = name; this->age = age; this->address = address;      
	}
	~Student(){}
	
    
	//重载 运算符<< : 把 "operator<<" 看作是函数名, 返回类型是 ostream类型的对象引用
	friend ostream& operator<< (ostream &os,Student &st)
	{
		os<<st.name<<"------"<<st.age<<"------"<<st.address<<endl;
		return os;
	}
protected:	
private:
	string name;
	int    age;
	string address;
};

void main()
{ 
	Student x1("刘莉莉",22,"东风路369号"); 
	cout<<x1; 
	//cout<<x1 ---结果OK,问题是这个写法很怪,是谁在调用那个重载函数?,x1显然是个参数,那是cout调用的 operator<< ? 
	// 解释:cout<<x1 这种调用格式,我摘录的上篇博文中写的很详细了,不过我没有仔细看,今天看了才清楚.
	/*
	当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。
	调用友元函数运算符的格式如下:
	  
		operator <运算符>(<参数1>,<参数2>) 它等价于 <参数1><运算符><参数2>
		这里参数1 就是 ostream 对象 cout,参数2就是x1
	 */
	cout = operator<<(cout,x1); //  显示调用,  	cout = cout<<x1;   OK
	x1.operator<<(cout,x1);  //  错! 这样调用不对. 友元函数不是成员函数么?答不是. 因此不用对象.成员的方式
	/*
	   网上找到一段话,对友元函数的解释,比较好懂:
	   友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,
	   它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
	   friend  类型 函数名(形式参数);
	   
		 友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
		 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
		 友元函数的调用与一般函数的调用方式和原理一致。 		 

	 *	
	 */
	
	/*
	"<<"  是个什么东东? C++ Prime P6
	这是个 "输出操作符", 其左边是ostream对象cout,右边是要输出的值
	它的操作返回输出流本身cout,也就是可以连续写的原因.
	
	*/
	
	// 既然 cout是 ostream对象,那么可以用 . 的形式 访问ostream的成员函数
	// 但是 operator<< 在本程序中已经重载了,要按照本程序的形参格式传入参数 ?
    
	   operator<<(cout,x1) ; // ok
	   ostream z(cout);  // ok
	   z<<x1; // 等同 cout<<x1 
	   
	   operator<<(z,x1);  // ok 
	   
	   cout<<"=========================="<<endl;
	   z =  operator<<(z,x1);  //ok
}


 

 //

 

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

void main()
{ 
  cout.operator <<("csdn"); // 0046E01,是个地址? 为什么不是输出字符串"csdn"?
  /*
   cout.operator<<("csdn")这样实际上调用的是ostream重载的成员方法operator<<(...),
   而ostream并没有针对char*类型的成员重载,所以输出整数。应该使用全局的二元重载operator<<来进行字符串输出
  ostream& operator<<(ostream& os, char* str);
  调用方法有二:方法一:操作符调用: cout<<"csdn";
  方法二:函数调用:operator<<(cout,"csdn");
   */

  //--
   

}


// ---

格式化输出: 
1. 成员函数: ostream::operator <<, 支持整数(不包括字符类型),浮点数,bool, const void*等。
2。全局函数: operator<<(ostream& os, T const&), 支持字符,字符串和自定义类型
 

#include <iostream>
#include <iomanip>
#include <sstream>
int main()
{
    std::istringstream input(" \"Some text.\" ");
    volatile int n = 42;
    double f = 3.14;
    bool b = true;;
    std::cout << n   // int overload
              << ' ' // non-member overload
              << std::boolalpha << b // bool overload
              << " " // non-member overload
              << std::fixed << f // double overload
              << input.rdbuf() // streambuf overload
              << &n // bool overload
              << std::endl; // function overload
}

C++ operator[]重载详解:从语法到实现自定义容器 操作符重载是C++实现多态性和扩展语言能力的重要机制,它允许开发者为用户自定义类型定义与内置类型相似的操作行为。其核心原理是通过定义特殊的成员函数,在编译时根据操作数类型决定调用哪个函数实现,从而实现特定语义。这一技术价值在于能够创建更直观、更符合领域逻辑的API,提升代码的可读性和封装性。在工程实践中,操作符重载广泛应用于实现自定义容器、智能指针、数值计算库等场景,使得用户能以类似内置类型的方式操作复杂对象。本文聚焦于下标操作符`operator[]`的重载,深入探讨其两种重载形式、返回引用与常量正确性等 阅读详情

相关推荐

[C/C++]_[操作符重载operator type()和operator()的区别]

1.看到WTL的CWindow源码时会发现这样的operator HWND()重载,仔细看会发现它并不是重载()操作符.

小白 7829

C++operator<<函数

让 class point{ public: int x; private: int y; public: point(int x,int y){this->x=x;this->y=y;} point(){x=0;y=0;} point &operator=(const point &other){ this->x=other.x; this->y=other.y; ret

joan11_3的专栏 4824

3D Gaussian Splatting环境配置和运行

使用conda命令根据environment.yml文件创建虚拟环境时,安装的pytorch是使用conda install 命令来安装的,实际上并不能成功安装带有gpu的pytorch,而这两个模块的安装依赖于带gpu的pytorch。如果不注释掉这三行,直接安装会报错

m0_46360757的博客 3326

第六章 C++运算符重载(operator)

以下是本人整理的C++基础知识点,内容并不包含全面的C++知识,只是对C++重点内容、特点进行整理和归纳。 6.1 C++运算符重载介绍 运算符重载介绍 功能 运算符在不同情况下有不同的功能,在不同情况下执行不同的操作 格式 返回值类型 operator运算符名称(形参表列){...} operator 关键字,用于定义重载运算符的函数 可以将【operator 运算符名称】这一部分看做函数名

qq_40632679的博客 2922

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 808

从SGX到TDX:英特尔机密计算的技术演进与选型指南

本文深入解析了英特尔两代机密计算技术SGX与TDX的核心差异与选型策略。SGX提供应用级飞地隔离,安全等级高但开发复杂;TDX提供虚拟机级信任域保护,兼容性好且易于部署。文章结合金融与医疗行业实战案例,为开发者提供了清晰的选型指南,帮助根据代码可改性、安全需求、部署规模及生态成本选择最合适的机密计算方案。

java5的博客 420

C++中的cout以及输出流运算符

Cout详细介绍   C++编程语言互换流中的标准输出流,需要iostream.h支持。读为 "c out"。 目录 使用范例 案例分析 技巧应用 cout控制符 C++的iostream家族 VS C的printf/scanf家庭 编辑本段 使用范例   #include   int main()   {   int a;

沉浮 4848

H.264 Profile与Level详解:如何为不同应用场景选择合适的编码配置

本文深入解析了H.264编码标准中的Profile与Level概念,指导开发者如何为不同应用场景选择合适的配置。文章对比了Baseline、Main和High三大Profile的特性与适用场景,并解释了Level如何限定视频的分辨率、帧率与码率上限。通过实战指南,帮助读者在视频通话、在线点播和专业制作等场景中,平衡画质、兼容性与性能,实现高效编码。

rgv2345678的博客 238

C++ operator 加法和<<

C++ operator加法和

shuyan745294340的博客 634

SAP 针对不同行业(制造业、零售业、金融业)推出了专属的云解决方案,以下是各行业的核心方案与特点

SAP推出行业专属云解决方案:制造业(SAP Digital Manufacturing Cloud)提供AI排产与质量预警,降低缺陷率;零售业(S/4HANA Cloud零售版)实现AI预测补货与全渠道库存同步,减少浪费;金融业(Business ByDesign)支持合规自动化与实时风控,降低审计成本。各方案均采用云原生架构,典型案例显示实施效果显著。

金牌架构师 491

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题

weixin_45735391的博客 6万+

C++,重载输出操作符<<, cout.operator()

C++,重载输出操作符<<, cout.operator()是什么东东? 标签: c++stringincludeos 2012-10-06 15:08 5701人阅读 评论(1) 收藏 举报 本文章已收录于: 分类: C/C++(154) 作者同类文章X 版权声明:本文为博主原创文章,未经博主允

autumn20080101的专栏 797

103.在 Vue 3 中使用 OpenLayers 控制图层来显示/隐藏地图

是一个强大的开源库,可以用于构建各种地理信息系统应用。在 Vue 3 中,我们可以结合。方法,可以直接控制某个图层是否可见,而不需要删除或重新创建图层。在开始之前,确保你已经搭建了 Vue 3 项目,并安装了。本文将详细介绍如何在 Vue 3 组合式 API (,并实现按钮控制地图的显示/隐藏功能。会导致 OSM 瓦片地图无法加载。方法控制地图图层的显示与隐藏。安装完成后,即可开始编写代码。在本教程中,我们介绍了如何在。来实现地图的显示/隐藏功能。来实现交互式地图,并通过。在 WebGIS 开发中,

小彭的博客 1560

C++中operator关键字(重载操作符)

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。 这是C+ +扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。 一、为什么使用操作符重载? 对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供...

Hello World 2486

lammps教程:官方自带eam_database程序拟合EAM势方法介绍

使用lammps模拟金属体系,最常用的势函数为eam、meam势。 对于大多数金属或者合金来说,可以从网上下载相对应的eam或meam势力场文件。 而对于一些新的合金材料,可能就找不到相对应的力场文件。 解决的方法有两种,一是采用混合势(pair_style hybrid),第二种方法是自己拟合势函数文件。 混合势的写法在前面文章中已经介绍过,本文介绍一种拟合EAM势的方法。 该方法是运行Xiaowang Zhou编写的一个拟合程序,该程序可自动生成所需要的合金势。 这个程序能够拟合的合金元素有: Cu,

lammps_jiayou的博客 4614

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

重载操作符operator详解

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。    这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。    一、为什么使用操作符重载? 对于系统的所有操作符,一般情况下,只

why is this 3266

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c++运算符重载(operator)

操作符重载是C++的强大特性之一,它允许开发者赋予标准操作符以用户定义类型的新意义,从而提升代码的可读性和直观性。然而,在使用时需要遵循一定的规则和最佳实践,以避免滥用或不当设计。通过合理设计和测试,操作符重载不仅能让代码更易于理解,还能充分展现面向对象编程的优势。但要牢记,操作符重载是一把“双刃剑”,设计不当可能导致代码难以维护或不符合预期逻辑。因此,需平衡功能性与可读性,在遵循语言规范的前提下实现目标功能。操作符重载既是C++程序员技能的体现,也是编写高效优雅代码的关键工具。

m0_73824825的博客 1159

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[C++] 关于new操作符的重载

关于c++ new操作符的重载 你知道c++ 的new操作符和operator new的区别么?也许你还会问,他们有区别吗? 当你写下面这样的代码时, string *pa = new string("memory managerment"); 你使用的是new操作符,这个操作符和sizeof一样,是c++语言级别支持的。你不能改变它的语义,它做的事情总是不变的:分配足够的内存以容纳对象,然后调...

selfsongs 5802

通俗理解C++ operator(重载操作符)

如何理解operator(重载操作符)? operator是C++的重载操作符关键字,其作用就是对操作符重新定义,使其能够适应其他不同数据类型的运算。 简单点说,就是“+”本来是算数运算符,一般用于基本数据类型,但是想要运算用户定义的数据类型class(在class可能会含有多种数据类型),这时候用重载运算符就可以将两个对象进行操作。 实现函数如下 mycomplex operator...

佳大先生的博客 1万+

ok-ww 鸣潮自动化工具快速上手指南:从安装到首次全自动日常

每天把同样的日常、清体力、刷声骸重复一遍,耗时又不省心。ok-ww 是一款不读内存、不改游戏文件的开源鸣潮自动化工具,靠图像识别"读懂"画面,再模拟真人鼠标键盘操作。这篇文章带你从环境准备走到第一次全自动日常。 ## ok-ww 功能全景 ok-ww 主界面的任务列表把下面的场景都盖住了,勾上就能跑: | 核心场景 | 它替你做什么 | 对应任务 | |---|---|---| | 一键日常

gitblog_00332的博客 415

重载 operator[]

操作者是C ++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将运算符=整体上视为一个函数名。   这是C ++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(C ++中,“功能”都是由函数实现的)。 一,为什么使用操作符重载?       对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库类,对...

weixin_41484240的博客 8895

c/c++开发,无可避免的操作符operator(篇一),操作符重载

c/c++开发,无可避免的操作符operator(篇一),操作符重载,较全面阐述了各种常规运算符、操作符和特殊运算符、操作符的重载设计,给出演示代码及演示结果。

技术需要分享 1301

c++ operator(重载操作符)

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator整体上视为一个函数名。      这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。    一、为什么使用操作符重载? 对于系统的所有操作符,一般情况下,只支持基本

tutb12345的专栏 2728

c++ new操作符的重载

<!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-a

David的专栏 1万+
上一篇: C++,类的对象,其地址,栈上还是堆上?
下一篇: VC自带的cl编译器和link链接器 的参数
sergery
博客等级 码龄18年 113粉丝 136原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值