C++ char* 在operator=中重新初始化

标签 c++ arrays char

我想请教一些问题。我正在我的学院学习 OOP C++ 类(class)。我们进行了一些与重新初始化动态分配的字符数组相关的练习。问题如下:

 class state
{
    private:
    char *szstate; // a name of object


    public:
    state &operator = (const state&);
};

state & state::operator = (const state &cop)
{
    if (this != &cop)
    {
        szstate = new char [strlen(cop.szstate)+strlen("==.")+1];
        strcpy(this->szstate,"==.");
        strcat(this->szstate, cop.szstate);

        return *this;
    }
    else return *this;

}

在快捷方式中,创建一个名为“DEFAULT”的对象“a”,在 b = a 之后,应该给我名为“==.DEFAULT”的对象 b。这将需要更多内存,因此为了安全起见,我使用了operator new。 问题是老师说应该还有

delete []szstate 

在我重新初始化对象的“名称”之前 - 我尝试了这个,但是出现了段错误。无论如何,我在 Stephen Prata 的书中找到了一些文字,他在其中写道 char* 应保持不变; char* 应被视为不可更改的常量,因此这将是对错误的某种解释。那么,到底是我做错了,还是老师没有权利呢? 感谢您的回答:)

最佳答案

szstate的初始值是多少?

您应该阅读有关三的规则。基本上,如果你 需要手写三个函数中的任何一个复制构造函数, 赋值和析构函数,你可能必须编写所有 他们。并且还有一些不平凡的构造函数。在你的 案例:

  • 您显然需要构造函数,以确保 szstate 是 始终初始化为定义的值。 (取决于 逻辑上,空指针可能没问题。)

  • 您还需要一个析构函数,以确保任何动态 szstate 指向的已分配内存已正确释放。

  • 在赋值运算符中,您必须确保永远不会 如果出现异常,则使对象处于无效状态。

执行此操作的经典方法是:

class State
{
    char* myState;
public:
    State()
        : myState( new char[1] )
    {
        myState[0] = '\0';
    }

    State( State const& other )
        : myState( new char[ strlen( other.myState ) + 1 ] )
    {
        strcpy( myState, other.myState );
    }

    ~State()
    {
        delete[] myState;
    }

    State& operator=( State const& other )
    {
        char const* tmp = new char[ strlen( other.myState) + 1 ];
        strcpy( tmp, other.myState );
        delete myState;
        myState = tmp;
        return *this;
    }
};

这实现了纯深复制语义,但它应该给你 指示您需要做什么。

此外:无需检查自分配 赋值运算符。需要进行此类检查通常是一个标志 你做错了什么,如果有的话就不安全 异常(exception)。

关于C++ char* 在operator=中重新初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23108665/

相关文章:

c++ - 使用 ranges-v3 连接不同类型

php - 如何从多维数组mysql插入多行

php - 如果 preg_match 不匹配模式,则取消设置数组?

JAVA扩展ASCII表用法

c++ - 如果 Stack 是使用 Vector 实现的,我应该在 Stack 类析构函数中放入什么?

c++ - 如何在实现文件中使用构造函数?

c++ - 我如何使用 tm 结构将分钟添加到当前时间?

php - 打印出从 SQL 数据库中获取的关联数组

string - "?\s"在 Elixir 中意味着什么?

C - 扫描动态二维字符数组并进行分配