C ++类与函数,构造函数中的引用参数

时间:2013-11-18 14:10:53

标签: c++ function class reference constructor

来自没有任何类的语言(程序流程仅使用函数控制),我很好奇何时在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时,是否真的分配了任何内存?

4 个答案:

答案 0 :(得分:4)

你的第一个问题太广泛了,无法在这里得到解答。尝试找一本关于面向对象编程的书。

add1_class是浪费时间。这只是一种调用函数的复杂方法。你也可以只调用一个函数。一般来说,只有当他们有一些 state ,即一些数据成员时才有用。

我希望add1_class变量占用一些内存(也许是1个字节)。因为即使它没有数据成员,获取add1_class变量的地址也是合法的,因此它必须在某处“生存”。也许编译器能够优化它,但可能不会。

答案 1 :(得分:1)

何时使其成为成员函数:当函数在函数需要访问私有或受保护成员时与该类逻辑耦合时,最好使其成为成员而不是朋友。

什么时候使它成为一个自由函数:当它是一个通用函数,可以被模板化以自然地在其他类上工作。您无法从独立函数访问该类的私有成员。

很多时候,您需要保留一些私有内容,以便用户无法在类定义之外编辑它们。当你对一个班级进行模板化时,这种情况会更常见。

答案 2 :(得分:1)

对我来说,答案是状态。如果你需要或者如果它有助于在函数调用之后存储状态,那么Class就是你想要的。

在您的示例中,您不需要课程,因为您没有需要存储的州。

答案 3 :(得分:1)

如果您没有任何具有某种状态的对象,则使用函数将是首选方式。如果需要实现一组没有任何状态的类似方法,可以考虑将它们封装在只使用静态方法的类中,或者在命名空间中声明它们。如果这是您所需要的,请查看此link,讨论这些选项。