C++:对于class来说,什么函数可以在class里面定义,什么函数最好在class外面定义(我的理解)

本文探讨了在《DataStructures,Algorithms,and Applications in C++》一书中关于顺序表LinearList的不同实现方法。文章强调了如何通过分离关注点的设计方式,即在类中实现通用功能,而在外部实现特定于实现细节的功能,来提高代码的复用性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2014.4.15

今天在看Data Structures, Algorithms, and Applications in C++的3.3和3.4时,特别是3.4的一句话,说用linked list和用formula representation两种实现方式实现同一个数据结构(顺序表LinearList)时,LinearList的class中很多内容(不是全部内容,如private中的数据要随着实现改变)是完全不用变的,只有具体的实现要改变。


能达到这种效果是以下原因:

1:LinearList把和不同实现方式无关的函数都放在class里面实现了,如Length函数{return length;}。

同时将和具体实现有关的函数只在class里面声明而没有具体实现,如Find,Delete,Insert函数。

(因此,在定义class时,如果以后想用不同实现方式来达到不同的效率,可以从这里得到启发:将与具体实现无关的函数放在class里面实现;与具体实现有关的函数放在别的地方实现,在class里只给出声明)。



<think>好的,用户问的是在C++中,定义宏是写在class里面还是外面。首先我需要回忆一下C++中宏的定义和作用域。宏是由预处理器处理的,它们在编译之前进行文本替换,没有作用域的概念。因此,无论宏定义在类内部还是外部,实际上都会被预处理在整个文件中展开。 接下来,我需要确认类内部是否可以定义宏。根据C++的标准,宏是预处理指令,而类定义属于编译期的结构。预处理指令在类定义内部是不被允许的,编译器会报错。比如,如果在类的大括号里面写#define,编译器会指出语法错误,因为类定义里面只能包含成员变量、成员函数、访问说明符等,不能包含预处理指令。 然后,我需要给出正确的做法,也就是将宏定义在类的外部,通常在头文件的顶部或者需要使用的地方之前。这样,宏在预处理阶段就会被替换,不会影响类的作用域。例如,正确的做法是在类定义之前或之后使用#define。 另外,可能还需要提到替代宏的方法,比如使用constexpr常量或者内联函数,这些更符合C++的最佳实践,因为它们有类型检查和作用域限制,避免了宏的一些潜在问题,比如命名冲突和调试困难。 最后,我需要考虑用户可能的后续问题,比如为什么宏不能放在类里面,或者替代方案的具体用法。这样在相关问题部分可以列出几个问题,帮助用户进一步学习。</think><< 在C++中,宏定义必须写在class外面。预处理指令(包括#define)不能出现在类定义的大括号{}内部。这是因为: 1. 语法规则:C++标准规定预处理指令不能出现在类/结构体/命名空间等复合声明内部 2. 预处理阶段:宏是在编译前处理的文本替换机制,与类的作用域无关 3. 编译器处理顺序:预处理器在编译器解析类定义之前就已经处理完所有宏定义 正确示例: ```cpp // 正确:在类外部定义宏 #define MAX_SIZE 100 class MyClass { int data[MAX_SIZE]; // 使用宏 // ... }; ``` 错误示例: ```cpp class MyClass { #define MAX_SIZE 100 // 错误:类内部不能有预处理指令 int data[MAX_SIZE]; //... }; ``` 替代方案建议: 1. 使用constexpr常量(推荐方式): ```cpp class MyClass { static constexpr int MAX_SIZE = 100; int data[MAX_SIZE]; //... }; ``` 2. 使用枚举值: ```cpp class MyClass { enum { MAX_SIZE = 100 }; int data[MAX_SIZE]; //... }; ``` 3. 使用inline函数: ```cpp class MyClass { static constexpr int max_size() { return 100; } int data[max_size()]; //... }; ``` >>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值