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

C++中调用默认构造函数重置对象属性失效原因咨询

Event类set成员函数两种实现的差异分析

我定义了如下Event类:

class Event {
    char m_event_desc[DESC_LENGTH + 1]; // 事件描述
    unsigned int m_time; // 事件开始时间
    unsigned int getHour();
    unsigned int getMinute(unsigned int hour);
    unsigned int getSecond(unsigned int hour, unsigned int minute);
    
public:
    Event(); // 默认构造函数
    void display();
    void set(const char* address = nullptr);
};

我想了解以下两种set成员函数实现的差异:后者能正常将对象状态重置为默认值,但前者无法做到,请问原因是什么?

第一种实现

void Event::set(const char* address) {
    if (address != nullptr && address[0] != '\0') {
        // 为当前Event对象设置新事件
        m_event_desc[0] = '\0';
        strcpy(m_event_desc, address);
        m_event_desc[strlen(address)] = '\0'; // 手动添加空终止符(多余操作)
        m_time = time;
    }
    else {
        Event(); // 试图重置为默认状态
    }
}

第二种实现

void Event::set(const char* address) {
    if (address != nullptr && address[0] != '\0') {
        // 为当前Event对象设置新事件
        m_event_desc[0] = '\0';
        strcpy(m_event_desc, address);
        m_event_desc[strlen(address)] = '\0'; // 手动添加空终止符(多余操作)
        m_time = time;
    }
    else {
        // 重置为默认状态
        m_event_desc[0] = '\0';
        m_time = time;
    }
}

原因分析

两种实现的核心差异在于else分支的逻辑:

  • 第一种实现中的Event();只是创建了一个临时的Event对象,这个对象是局部临时变量,执行完该行后就会被立即销毁,完全不会修改当前调用set函数的对象(即this指针指向的对象)的成员变量,自然无法重置状态。
  • 第二种实现的else分支直接操作当前对象的成员:将m_event_desc设为空字符串(和默认构造函数的初始化逻辑一致),同时把m_time设为默认值,直接修改了当前对象的状态,因此能正确完成重置。

另外补充:第一种实现里strcpy之后手动添加'\0'是多余操作,因为strcpy会自动将源字符串的空终止符复制到目标数组中。

内容的提问来源于stack exchange,提问作者Himawari.Ksm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:40:24