You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中重载一元递减运算符时右值相关报错问题求助

关于C++重载一元递减运算符(--)的编译错误分析与修正

错误原因拆解

1. 返回类型不匹配

你报错的代码里,函数声明返回Mystring&(引用),但你写了return &temp;——&temp是Mystring*类型的指针,和函数要求的引用类型完全不匹配,这就是编译错误的直接来源。

2. 局部对象的悬空引用问题

就算你改成return temp;,temp是函数内部的局部变量,当函数执行完毕时,temp会被销毁,此时返回它的引用会得到一个悬空引用,后续任何对这个引用的操作都是未定义行为(比如程序崩溃、乱码等)。

针对你的需求的两种修正方案

你的需求是“将类中字符转为小写,并返回小写的Mystring实例”,这里分两种常见设计:

方案1:修改当前对象,返回自身引用(符合前置--的常规语义)

如果希望--obj直接修改obj本身,让它变成小写,然后返回自身支持链式调用,应该这样写:

Mystring& operator--() {
    cout << "I am minus minus" << endl; // 注意你之前的输出写错成plus plus了
    // 直接修改当前对象的str,不用新建临时对象
    size_t i = 0;
    while (i < strlen(this->str)) {
        this->str[i] = tolower(static_cast<unsigned char>(this->str[i])); // 避免tolower的未定义行为
        i++;
    }
    return *this; // 返回当前对象的引用
}

注:这里直接修改类内的str成员,前提是你的Mystring类的str是可修改的(比如是char*类型且已经正确分配内存)。

方案2:不修改原对象,返回新的小写对象(你的第一个版本的修正版)

如果希望--obj不改变原对象,而是返回一个新的小写对象,就用你第一个返回值的版本,但要修复其中的内存越界bug:

Mystring operator--() {
    cout << "I am minus minus" << endl;
    char *x = new char[strlen(this->str) + 1];
    size_t i = 0;
    while (i < strlen(this->str)) {
        x[i] = tolower(static_cast<unsigned char>(this->str[i]));
        i++;
    }
    x[i] = '\0'; // 之前的x[i+1]会越界,i已经等于字符串长度,x[i]才是正确的结束位置
    Mystring temp{x};
    delete []x;
    return temp;
}

这个版本返回临时对象是合法的,C++允许返回局部对象的副本,编译器通常会做返回值优化(RVO)来避免不必要的拷贝。

额外提示

  • tolower函数的参数需要是unsigned char类型,否则如果字符是负数(比如某些编码下的扩展字符),会触发未定义行为,所以要加static_cast<unsigned char>转换。
  • 前置--和后置--的重载要区分:后置版本需要加一个int参数作为标记,比如Mystring operator--(int) {...},通常后置版本返回临时对象,前置版本返回自身引用。

内容的提问来源于stack exchange,提问作者Sonet Adhikary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:20:40