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
相关产品推荐
相关产品推荐

