must take either zero or one argument错误分析及this指针详解

C++核心编程(十五)对象指针为空, 当对象指针为空的时候能访问成员函数,不能访问成员函数,加this==NULL的判断可以提高程序的健壮性。 阅读详情
//在l love you 后面加上相应的字符串然后输出
#include <iostream>
using namespace std;
class stri_add
{
public:
    stri_add(){s1= " ";}
    stri_add(string a1)
    {
        s1 = a1;
    }
    stri_add  operator+(stri_add b,string a)
    {
      b.s1 = b.s1+a;
      return b;
    }
    friend ostream& operator<<(ostream &ou1,stri_add s)
    {
        ou1<<"I think "<<s.s1;
    }
private:
    string s1;
};
int main()
{
    stri_add str("I love you");
    cout << str+"  HFUT";
    return 0;
}

结果程序于第12行报错:D:\Program Files\CodeBlocks\source files\project\1\main.cpp|42|error: ‘stri_add stri_add::operator+(stri_add, std::string)’ must take either zero or one argument|

解决办法:将重载加法运算函数改为

stri_add  operator+(string a)
    {
       return stri_add(s1+a);
    }
因为当运算符重载时,此时会有this指针帮助用户进行获取对象的信息,而不需要显性指明对象。 简单来说,就是当重载运算符函数的形参列表中有两个且第一个为当前对象类型时,第一个形参需要省略 。 即当成员函数被定义为stri_add operator+(stri_add b,string a)这是错误的,应该改为stri_add operator+(string a) 下面对此处包含的this指针做详细叙述: 本文转自与:http://blog.youkuaiyun.com/feiyond/article/details/1652505

先要理解class的意思。class应该理解为一种类型,像int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型)。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。
理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解this 的类型应该是myclass *,而对其的解引用*this就应该是一个myclass类型的变量。
通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。 

1. this指针的用处:
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .
2. this指针的使用:
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。 
3. this指针程序示例:
this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址。
根据以下程序来说明this指针
#include<iostream.h>
class Point
{
  int x, y;
public:
  Point(int a, int b) { x=a; y=b;}
  Void MovePoint( int a, int b){ x+=a; y+=b;}
  Void print(){ cout<<”x=”<<x<<”y=”<<y<<endl;}
};
void main( )
{
   Point point1( 10,10);
   point1.MovePoint(2,2);
   point1.print( );
}
当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。
MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:
void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}
即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。
即该函数过程可写成 point1.x+= a; point1. y + = b;
4. 关于this指针的一个精典回答:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。
 
7.3.4 Alternative Technologies 虽然前面章节详细描述了 JEDEC 或 Rambus 采用的特定技术(如可编程 CAS 延迟、双边缘时钟、片内 DLL 等),但还有许多其他方法可以达到类似的效果。这段文字是一个章节的引导性说明,出现在书中讨论“替代技术”(alternative technologies)的部分。:通过了解这些替代技术,读者可以更深刻地认识到 DRAM 设计者在性能、成本、功耗、复杂度等方面所做的各种权衡。:许多所谓的“替代技术”并不是全新的发明,而是将早已存在的电路或系统设计思想应用到新的问题场景中。 阅读详情

相关推荐

CentOS 6.3 x64 安装 VirtualBox 内核模块编译实战指南

VirtualBox 是一款广泛使用的开源桌面虚拟化平台,其核心依赖于与宿主内核深度耦合的内核模块(如 vboxdrv)。在企业级 Linux 发行版如 CentOS 6.3 中,由于内核版本锁定(2.6.32)、工具链陈旧(GCC 4.4.7)及 ABI 兼容性限制,官方二进制安装包常因无法构建内核模块而失败。此时必须转向源码编译模式,严格匹配 kernel-devel 版本,并手动驱动 kBuild 构建系统。该方案不仅解决‘Kernel driver not installed (rc=-1908)’

weixin_33912638的博客 311

c++运算符重载报错must take either zero or one argument解决方法

在重载双目运算符时报错must take either zero or one argument。 后来发现原因是这里的运算符函数被认为是类的成员函数,而成员函数隐含传递本对象地址给this指针,所以只需要一个显示形式参数。由于作为友元的双目运算符函数,是两个显式形式参数,可以将这个重载运算符的函数定义为友元函数,即在前面加上friend。

QJYYY128的博客 2043

49_C++_bug【must take either zero or one argument—类内成员函数重载复写,只能有一个参数】

C:\ios2021\c++\day22\main.cpp:130: error: ‘MyString& MyString::operator+(MyString&, char*)’ must take either zero or one argument MyString &operator +(MyString &mstr1, char *ptr) ^

HanLongXia的博客 455

must take either zero or one argument错误分析

今天在整理笔记的时候,发现笔记本上只有“+”重载运算符的友元函数的形式,没有成员函数的重载形式,但是根据重载的规则,这个运算符也是可以用成员函数的重载方式的,便开始了自己的尝试,然后我发现了一个问题,会报错“must take either zero or one argument” 我的代码是这样子写的: String& String:: operator+(const String

zjq_smile的博客 7947

RC4加密算法详解

RC4(也称为 Rivest Cipher 4)是流密码的一种形式,流密码逐字节操作数据流。RC4 流密码是使用最广泛的流密码之一,它通过算法一次一个字节地加密消息,简单并且操作速度快。RC4是一种在电子信息领域加密的技术手段,用于无线通信网络,是一种电子密码,只有经过授权的用户才能享受该服务,使用 64 位或 128 位密钥大小。它通常用于安全套接层 (SSL)、传输层安全 (TLS) 等应用,也用于 IEEE 802.11 无线 LAN 标准。在存储大量的信息时,RC4展现出它的实用性,面对大量的数据,

weixin_43211186的博客 1万+

利用ArcMap实现遥感图像语义分割标注的完整流程解析

本文详细解析了利用ArcMap进行遥感图像语义分割标注的完整工作流。从工程创建、数据导入、SHP文件创建,到实战勾画地物、要素转栅格,再到最终的裁剪对齐,提供了每一步的关键操作与避坑指南。该方法特别适合处理大尺寸、带地理坐标的遥感影像,能高效产出精准对齐的图像-标签对,为后续深度学习模型训练奠定可靠的数据基础。

gpu4optimizer的博客 1209

对于C++中:this指针的理解

先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型)。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。理解了这个,就好解释this了,my里的this 就是指向my的指针。如

2859

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5556

must take either zero or one argument错误解决方式之一

must take either zero or one argument错误 代码如下: class String { public: String &amp; operator+(const String &amp;); String &amp; operator+(const char *); String &amp; String::operator+(co...

gyh3313的博客 1万+

浅析MOS管导通过程及RC吸收电路设计要点

RC吸收电路 米勒电容 MOS导通过程

liangbo1999的博客 2万+

ubuntu18.04安装xenomai3.1(百分百成功版)

ubuntu18.04安装xenomai3.1(百分百成功版),保姆级教学!!!

h542812556sdu的博客 2059

运算符重载must take either zero or one argument错误

在写类对象(我用结构体了)时会用到运算符重载,这时候出现了问题,编译时始终报错:item::operator+(const item&, const item&)' must take either zero or one argument; 代码在此: struct item{ int a,b; item(int _a=0,int _b=0)...

T3649907181的博客 2398

射频工程师笔记---射频通信基础

回顾一下移动通信技术的发展,其实是互联网和通信技术的融合过程。在这个过程中,很多应用都在不断加入其中。比如计算机跟通信的融合产生了互联网、互联网跟手机的融合带来了移动互联网。手机可以看杂志、看视频、听音乐,于是又出现了内容服务产业;再后来,电视音箱等设备也能联网,于是网络跟家电又产生了融合。所以应用的出现总是在融合其他产业。在1995年,比尔·盖茨在《未来之路》一书中首次提出:在未来...

多年硬件从业经历,热爱学习,记录生活! 2万+

C++ 编译时“must take either zero or one argument”错误

今天写作业时有一题,计算复数的加减法,需要将二元运算符+和-重载。第一次编译时遇到了must take either zero or one argument的报错。一下是部分代码 { private: //数据成员 T real; T image; public: Complex(); //默认构造函数模板 Complex(const T &m, const T &n);

Louise_Lu19的博客 1757

Python爬虫实战:采集菜谱网站数据——以“下厨房”为例

随着互联网的发展,海量优质数据为各类应用提供了坚实基础。菜谱作为用户日常生活中需求极高的内容,丰富多样的菜谱数据不仅方便用户烹饪,也为美食推荐、营养分析等研究提供了数据支持。本文将围绕国内知名菜谱网站“下厨房”(https://www.xiachufang.com)展开,结合最新Python爬虫技术,详细讲解如何高效、规范地采集菜谱数据,包括菜谱名称、食材、步骤、评分、评论等丰富信息。全篇覆盖爬虫原理、框架选型、反爬应对、数据存储和简单分析,是学习爬虫实战的绝佳案例。菜谱标题作者信息菜谱图片。

2201_76125261的博客 1897

Python 爬虫实战:医学临床指南爬取(含 PDF 解析与结构化存储)

在当今数字化时代,医学临床指南作为医生进行科学诊疗的重要参考资料,包含大量经过临床验证的诊疗路径和建议。这些指南通常发布在权威医学网站上,数量庞大且更新频繁。如何自动化地抓取并存储这些指南,成为医疗数据分析、医学研究以及医疗 AI 模型训练等工作的关键第一步。本文将系统讲解如何利用 Python 爬虫技术从权威医学网站爬取临床指南内容,并实现 PDF 解析与结构化存储。

u014481728的博客 449

二元运算符重载 must take either zero or one argument

今天对二元运算符重载的时候编译报错:[Error] 'youlishu youlishu::operator+(youlishu&, youlishu&)' must take either zero or one argument 查了一下我发现,用成员方式重载运算符,   不能改变参数的个数  。 二元运算符用成员重载时,   只需要一个参数,   另一个参数由this指针传入   所以

北纬18度 1686

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

QN8035与Si4703 FM收音芯片选型深度对比:架构、调试与实战决策

FM收音芯片是便携音频、车载终端和IoT设备的关键模拟-数字接口器件,其性能不仅取决于标称灵敏度或功耗参数,更由底层接收架构(超外差 vs 软件定义无线电SDR)根本决定。QN8035采用成熟模拟前端+固定中频设计,强调PCB布局鲁棒性与低成本;Si4703基于全数字接收链路,依赖高速ADC与DSP实现高一致性与RDS/AFC等高级功能。技术价值体现在量产良率、抗干扰能力与产线调试效率——前者需频谱仪调谐陶瓷滤波器,后者靠I²C寄存器校准与固件配置。典型应用场景包括低功耗户外设备(倾向QN8035)、高一致

weixin_33824363的博客 480

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

高效学习规划:从目标拆解到执行管理的科学方法

学习规划是提升知识获取效率的核心技术,其本质是通过系统化方法将宏观目标转化为可执行单元。基于认知科学原理,有效的学习管理需要结合目标拆解、时间块分配和进度追踪三大要素。在工程实践层面,Notion看板与Anki记忆卡等工具组合能实现知识管理的可视化与可持续性。特别在备考和技能提升场景中,采用日期标注法配合三色标记系统,可显著改善学习坚持率。现代时间管理工具如Toggl Track结合番茄工作法改良方案,为解决计划完不成和学习效率低下等典型问题提供了数据化解决方案。

weixin_33970449的博客 190

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

GOTO 语句有害论 | 反对 GOTO 语句的理由

……

u013669912的博客 1873

虚数的本质 | 从旋转变换到复平面的几何直观

…

u013669912的博客 2328

UE5.4二维码生成插件QRcode

【代码】UE5.4二维码生成插件QRcode。

程序员的早餐: if (有时间) { 吃早餐; } else { 喝杯咖啡顶一下; } // 永远走else 633

CPU 缓存 | 原理、映射、一致性

……

u013669912的博客 409

Debugging Embedded Linux

Section #6. Debugging Embedded Linux From a device driver perspective, embedded software developers often face interfaces not commonly found on conventional computers. Figure 1.3 shows a hypothetical...

mounter625的专栏 1161

Rage(PC) Modding Notes : Console Commands

_________________________________________ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Rage(PC) Modding Notes : Console

tailiangliang的专栏 2341
上一篇: C++常见面试题30道
下一篇: 经典游戏---贪吃蛇从C++代码实现
菜鸟方圆圆
博客等级 码龄10年 26粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值