来自没有任何类的语言(程序流程仅使用函数控制),我很好奇何时在C ++中使用类而不是何时使用函数。在类构造函数中使用引用时,我还有一个关于内存分配的特定问题。对于代码:
void add1_func(int &x){
x=x+1;
}
class add1_class{
private:
void add1(int &x){
x=x+1;
}
public:
add1_class(int &x){
add1(x);
}
};
int main(){
int x=2;
add1_func(x);
add1_class foo(x);
return 0;
}
功能和类路线在这里显然都达到了同样的效果。是一个被认为是更好的做法,还是只是一个偏好的问题?在这个简单的情况下,函数可能会更好,但是如果类包含一堆我想要组合在一起的其他私有函数,那么将它们放在一个类中可能会更好。
问题的第二部分:两种方法在内存使用方面是否相同?我知道当你声明一个像
这样的变量时Type t;
然后分配内存,但实例't'需要很多内存“类型”。但是因为我在类构造函数中使用了一个引用(可以吗?),当我声明foo时,是否真的分配了任何内存?
答案 0 :(得分:4)
你的第一个问题太广泛了,无法在这里得到解答。尝试找一本关于面向对象编程的书。
add1_class
是浪费时间。这只是一种调用函数的复杂方法。你也可以只调用一个函数。一般来说,只有当他们有一些 state ,即一些数据成员时才有用。
我希望add1_class
变量占用一些内存(也许是1个字节)。因为即使它没有数据成员,获取add1_class
变量的地址也是合法的,因此它必须在某处“生存”。也许编译器能够优化它,但可能不会。
答案 1 :(得分:1)
何时使其成为成员函数:当函数在函数需要访问私有或受保护成员时与该类逻辑耦合时,最好使其成为成员而不是朋友。
什么时候使它成为一个自由函数:当它是一个通用函数,可以被模板化以自然地在其他类上工作。您无法从独立函数访问该类的私有成员。
很多时候,您需要保留一些私有内容,以便用户无法在类定义之外编辑它们。当你对一个班级进行模板化时,这种情况会更常见。
答案 2 :(得分:1)
对我来说,答案是状态。如果你需要或者如果它有助于在函数调用之后存储状态,那么Class就是你想要的。
在您的示例中,您不需要课程,因为您没有需要存储的州。
答案 3 :(得分:1)
如果您没有任何具有某种状态的对象,则使用函数将是首选方式。如果需要实现一组没有任何状态的类似方法,可以考虑将它们封装在只使用静态方法的类中,或者在命名空间中声明它们。如果这是您所需要的,请查看此link,讨论这些选项。