C++ 作为其他类上的私有成员进行对象声明/初始化时出现问题

C++ 作为其他类上的私有成员进行对象声明/初始化时出现问题,c++,class,object,initialization,declaration,C++,Class,Object,Initialization,Declaration,对不起,如果以前有人问过这个问题,我似乎找不到任何东西。我不知道如何搜索这个 我有这样的想法: class A { private: int x; int y; public: A(int, int); } class B { private: A a(3, 4); // Doesn't compile because of this line public: B(); } 我能想

对不起,如果以前有人问过这个问题,我似乎找不到任何东西。我不知道如何搜索这个

我有这样的想法:

class A {
    private:
        int x;
        int y;
    public:
        A(int, int);
}

class B {
    private:
        A a(3, 4); // Doesn't compile because of this line
    public:
        B();
}
我能想到的解决这个问题的唯一方法是把
a
作为
a
的指针,然后做
a=newa(3,4)
B
的构造函数中。但我不希望
a
成为指针

解决这个问题的正确方法是什么

class B {
    private:
        A a;
    public:
        B() : a(3,4) {}
};
在更广泛的意义上,解决方法是通过C++学习C++。是的,这很刺耳,但教程的要点是,它们以合理的顺序介绍概念,当它们告诉您有关数据成员时,它们将同时告诉您如何初始化它们


在更广泛的意义上,解决方法是通过C++学习C++。是的,这很刺耳,但教程的要点是,它们以合理的顺序引入概念,当它们告诉您有关数据成员时,它们将同时告诉您如何初始化它们。

如果您希望用参数3和4初始化B.a,那么您可以在B的构造函数中这样做,例如

class B {
    private:
        A a;
    public:
        B(): a(3, 4) {}
}

如果您希望用参数3和4初始化B.a,那么您可以在B的构造函数中进行初始化,例如

class B {
    private:
        A a;
    public:
        B(): a(3, 4) {}
}

用“成员初始化列表”标记
B
的构造函数。而不是:

B::B() {
    ...
}
您可以这样做:

B::B() : a(3, 4) {
    ...
}
或者,如果在标题中定义了构造函数:

class B {
    private:
        A a;
    public:
        B() : a(3, 4) {
            ...
        }
};

用“成员初始化列表”标记
B
的构造函数。而不是:

B::B() {
    ...
}
您可以这样做:

B::B() : a(3, 4) {
    ...
}
或者,如果在标题中定义了构造函数:

class B {
    private:
        A a;
    public:
        B() : a(3, 4) {
            ...
        }
};

没有别的办法吗?如果我有几十个变量要初始化呢?代码看起来很奇怪。@ NasGuld:C++看起来很奇怪,如果你不熟悉它。直到有几十个数据成员和不止一个构造函数,这实际上不是问题。C++:看起来很奇怪。这是语言的一部分。忘掉它。也就是说,如果你真的讨厌语法,并且
class A
有一个默认构造函数,它将自动使用;然后,您可以在构造函数中为
a
a=a(3,4);
)分配一个新值,但这是低效的。最好尽可能使用初始化列表,因为它可以更好地优化并生成更小/更快的代码。我是否可以假设这与将
setVals
方法声明为
a.setVals(3,4)在
B
的构造函数中使用相同?这也是低效的?这加上用
a
的临时实例的内容实际替换
a
的内容的成本。如果您没有为
A
定义赋值运算符,那么本质上就是调用
memcpy()
——如果您定义了,则是该方法的成本。因此,执行
a=a(3,4)
的总成本将根据
a类的实际类型而变化。只要克服对语法的厌恶,使用初始化列表即可。它将完全按照你需要的方式,是初始化C++中字段的正确方法。没有其他方法吗?如果我有几十个变量要初始化呢?代码看起来很奇怪。@ NasGuld:C++看起来很奇怪,如果你不熟悉它。直到有几十个数据成员和不止一个构造函数,这实际上不是问题。C++:看起来很奇怪。这是语言的一部分。忘掉它。也就是说,如果你真的讨厌语法,并且
class A
有一个默认构造函数,它将自动使用;然后,您可以在构造函数中为
a
a=a(3,4);
)分配一个新值,但这是低效的。最好尽可能使用初始化列表,因为它可以更好地优化并生成更小/更快的代码。我是否可以假设这与将
setVals
方法声明为
a.setVals(3,4)在
B
的构造函数中使用相同?这也是低效的?这加上用
a
的临时实例的内容实际替换
a
的内容的成本。如果您没有为
A
定义赋值运算符,那么本质上就是调用
memcpy()
——如果您定义了,则是该方法的成本。因此,执行
a=a(3,4)
的总成本将根据
a类的实际类型而变化。只要克服对语法的厌恶,使用初始化列表即可。它将完全按照您需要的方式,是初始化C++中字段的正确方法。您所有定义的类型都是简单的POD型积分类型吗?如果是这样,您可以将它们创建为非类型模板参数。例如,
A。不过,这种方法有一些限制,其中一个是那些init值必须在编译时已知。您定义的所有类型都是简单的POD-like整数类型吗?如果是这样,您可以将它们创建为非类型模板参数。例如,
A。不过,这种方法有一些限制,其中之一是必须在编译时知道init值。