c++ - 尝试为 *this 指针赋值失败

标签 c++ class object this

我在 C++ 中得到了这个程序,如果我把最后两行放在评论中,它会工作得很好: a = b; MyAr c(b); 我用删除它的方法对其进行了测试。问题出在我认为的 *this 指针上,当我编译和运行程序时,它会闪烁一会儿然后消失。你能帮我么?谢谢!

#include <iostream>
using namespace std;

class MyAr {
    int *p;
    int len;
    public:
        MyAr();
        MyAr(int a);
        MyAr(const MyAr& ob);
        ~MyAr();

        MyAr& operator=(const MyAr& ox) { *this = ox; }
        int& operator[](int i) { return p[i]; }
        int length();
};

MyAr::MyAr() : p(0), len(0) {}
MyAr::MyAr(int a) : p(new int[a]), len(a) {}
MyAr::MyAr(const MyAr& ob) { *this = ob; }
MyAr::~MyAr() { delete p; }

int MyAr:: length(){
    return len;
}

int main(){

    MyAr a;
    MyAr b(10);
    for(int i=0; i< b.length(); ++i)
        b[i] = i;

    a = b;
    MyAr c(b);

    system("pause");
    return(0);
}

最佳答案

定义

MyAr& MyAr::operator=(const MyAr& ox) { *this = ox; }

是递归的,因为赋值 *this = ox 再次调用重载赋值运算符。所以你有无限递归(可能导致你的程序最终终止)。

这与调用以下函数相同:

void f() { f(); }

或者,在英语中,您已经将“assign from value ox”的含义定义为“assign from value ox”,而您真正需要的是要做的是根据您的类型的构成结构来定义它的含义!

例如:

MyAr& MyAr::operator=(const MyAr& ox) {
   delete [] a;
   a = nullptr;
   len = 0;

   return *this;
}

(这可能没有您想要的语义;请根据口味进行修改。)

关于c++ - 尝试为 *this 指针赋值失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36687797/

相关文章:

c++ - 这样的初始化列表在 C++11 中合法吗?

c++ - TBB Parallel_for 计数,增量变量不准确

c++ - 模板/预处理器 hackery 可以用于支持参数列表中间的可变参数吗?

python - 是否建议在单个文件中包含多个类?

c++ - 如何在 WinApi 中从 HANDLE 制作 FILE*?

c++ - 在 C++ 中初始化具有相同名称的不同模板

android - 导入我的自定义类并调用它的方法?

C++:如何让不同的类函数操作我的类成员变量

java - 想要将对象数组运行到通用构造函数中

javascript - 将范围为 {n} (length prop) 的数组中的值分组到下一项