Effective C++第三版学习笔记

需积分: 10 1 下载量 190 浏览量 更新于2024-07-26 收藏 334KB PDF 举报
"Effective_C++_3rd笔记.pdf" 这篇读书笔记是基于《Effective C++ Third Edition》这本书,作者是吴金龙,来自北京大学数学科学学院。笔记内容涵盖了C++编程中的最佳实践和优化技巧,旨在帮助读者更好地理解和利用C++语言特性。 在第一章“让习惯C++”中,作者强调了C++是一个多元化的语言,由多个部分组成,如C、C++标准库和C++特定的特性。条款01指出应视C++为一个语言联邦,理解其不同部分的交互。条款02建议使用const、enum和inline代替预处理器宏#define,以提高代码的安全性和可读性。条款03强调了const关键字的重要性,它能帮助防止意外修改对象状态。条款04提醒开发者确保对象在使用前已被正确初始化。 第二章“构造/析构/赋值运算”关注对象生命周期和行为。条款05提到了编译器自动生成的函数,如默认构造函数、拷贝构造函数和赋值运算符,程序员应熟悉这些机制。条款06建议如果不需要编译器生成的函数,应明确声明它们为private或提供替代版本。条款07提倡在多态基类中声明virtual析构函数,以支持正确地销毁派生类对象。条款08和09告诫不要让异常从析构函数中抛出,以及避免在构造和析构过程中调用virtual函数,因为这可能导致不可预见的行为。条款10至12讨论了赋值运算符的正确实现,包括返回引用、处理自我赋值和完全拷贝对象的所有成分。 第三章“资源管理”聚焦于内存管理和对象生命周期。条款16指出在使用new和delete进行动态内存分配时,应保持配对操作的一致性,例如,动态数组应使用new[]和delete[]。 第四章“设计与声明”涉及类的设计原则。条款19建议将类设计视为类型设计,以增强抽象性和封装性。条款20提倡使用引用传递常量而非值传递,以减少不必要的拷贝和提高效率。 第五章“实现”讨论了代码实现层面的技巧。条款26提出尽可能延迟变量的定义,以优化内存使用和提升程序性能。条款28警告避免返回指向对象内部组件的句柄,因为这可能暴露对象的内部细节并导致不稳定。条款30深入探讨了内联函数的优缺点,提醒开发者要明智地使用内联。 第六章“继承与面向对象设计”关注了面向对象编程的原则。条款33提醒避免覆盖基类中的名称,以保持代码清晰和一致性。条款36告诫不要重新定义继承而来的非虚函数,因为这可能导致二义性和难以预料的行为。 这个笔记涵盖了C++编程中的关键主题,为C++开发者提供了实用的指导,帮助他们写出更高效、更健壮的代码。

优化代码 def cluster_format(self, start_time, end_time, save_on=True, data_clean=False, data_name=None): """ local format function is to format data from beihang. :param start_time: :param end_time: :return: """ # 户用簇级数据清洗 if data_clean: unused_index_col = [i for i in self.df.columns if 'Unnamed' in i] self.df.drop(columns=unused_index_col, inplace=True) self.df.drop_duplicates(inplace=True, ignore_index=True) self.df.reset_index(drop=True, inplace=True) dupli_header_lines = np.where(self.df['sendtime'] == 'sendtime')[0] self.df.drop(index=dupli_header_lines, inplace=True) self.df = self.df.apply(pd.to_numeric, errors='ignore') self.df['sendtime'] = pd.to_datetime(self.df['sendtime']) self.df.sort_values(by='sendtime', inplace=True, ignore_index=True) self.df.to_csv(data_name, index=False) # 调用基本格式化处理 self.df = super().format(start_time, end_time) module_number_register = np.unique(self.df['bat_module_num']) # if registered m_num is 0 and not changed, there is no module data if not np.any(module_number_register): logger.logger.warning("No module data!") sys.exit() if 'bat_module_voltage_00' in self.df.columns: volt_ref = 'bat_module_voltage_00' elif 'bat_module_voltage_01' in self.df.columns: volt_ref = 'bat_module_voltage_01' elif 'bat_module_voltage_02' in self.df.columns: volt_ref = 'bat_module_voltage_02' else: logger.logger.warning("No module data!") sys.exit() self.df.dropna(axis=0, subset=[volt_ref], inplace=True) self.df.reset_index(drop=True, inplace=True) self.headers = list(self.df.columns) # time duration of a cluster self.length = len(self.df) if self.length == 0: logger.logger.warning("After cluster data clean, no effective data!") raise ValueError("No effective data after cluster data clean.") self.cluster_stats(save_on) for m in range(self.mod_num): print(self.clusterid, self.mod_num) self.module_list.append(np.unique(self.df[f'bat_module_sn_{str(m).zfill(2)}'].dropna())[0])

2023-05-25 上传