在c+中初始化类的数据成员+; 对于C++中的类,我们可以提供默认构造函数以及任何参数化构造函数。如果在每个参数化构造函数中使用构造函数初始化列表,那么它不是像我们强> >初始化一个成员不止一次吗?这个概念有效吗?(我想我们只能初始化一次)。 通过这个逻辑,如果我们有一个常数数据成员或一个引用,并且如果我想用用户提供的值初始化常数,我怎么做呢?我在C++底漆中找到了一个代码片段,它看起来像 class constref { public: constref(int ii):i(ii),ci(ii),ri(i) { } private: int i; const int ci; int &ri; }

在c+中初始化类的数据成员+; 对于C++中的类,我们可以提供默认构造函数以及任何参数化构造函数。如果在每个参数化构造函数中使用构造函数初始化列表,那么它不是像我们强> >初始化一个成员不止一次吗?这个概念有效吗?(我想我们只能初始化一次)。 通过这个逻辑,如果我们有一个常数数据成员或一个引用,并且如果我想用用户提供的值初始化常数,我怎么做呢?我在C++底漆中找到了一个代码片段,它看起来像 class constref { public: constref(int ii):i(ii),ci(ii),ri(i) { } private: int i; const int ci; int &ri; },c++,constructor,C++,Constructor,上面的代码是不是错了。因为我们提供了一个带参数的构造函数,所以我们需要定义一个默认构造函数。所以常量和引用被初始化了两次,这是一个错误。我如何使它工作? 谢谢 但是你能告诉我这段代码里发生了什么吗 #include<iostream> #include<stdlib.h> using namespace std; class dummy { int a; public: dummy():a(0) { } dummy

上面的代码是不是错了。因为我们提供了一个带参数的构造函数,所以我们需要定义一个默认构造函数。所以常量和引用被初始化了两次,这是一个错误。我如何使它工作? 谢谢

但是你能告诉我这段代码里发生了什么吗

#include<iostream>
#include<stdlib.h>
using namespace std;

class dummy
{
    int a;
public:
      dummy():a(0)
      {
      }
      dummy(int i):a(i)
      {
      }
      void output()
      {
        cout<<a<<endl;
      }
   };
   int main()
   {
    dummy d;
    d=dummy(4);
    d=dummy(3);
    d.output();
    return 0;
  }
#包括
#包括
使用名称空间std;
类虚拟
{
INTA;
公众:
dummy():a(0)
{
}
虚拟(int i):a(i)
{
}
无效输出()
{

cout多个构造函数提供多种初始化对象及其成员的方法。创建对象时,使用一个构造函数,因此只有一个初始化。根据创建对象时给出的参数选择构造函数


从示例中,
constref c(3);
使用构造函数创建对象
c
,将值3传递给构造函数。如果类还定义了默认构造函数,也会发生同样的情况。默认构造函数的存在不会影响
c
的创建,因为默认构造函数不带参数,因此不能以3作为参数调用参数。

多个构造函数提供多种初始化对象及其成员的方法。创建对象时,使用一个构造函数,因此只有一个初始化。根据创建对象时给出的参数选择构造函数


从示例中,
constref c(3);
使用构造函数创建对象
c
,将值3传递给构造函数。如果类还定义了默认构造函数,也会发生同样的情况。默认构造函数的存在不会影响
c
的创建,因为默认构造函数不带参数,因此不能以3作为参数调用一个参数。

首先,没有必要提供默认构造函数,但如果不提供,则无法创建像
constref c1;
这样的对象,或者甚至无法创建像
constref c1[10]这样的对象数组
。创建类constref对象的唯一方法是向构造函数提供整数参数,即
constref c1(10);

其次,常量和引用在代码中不会初始化两次。它们只初始化一次,即INTEGET“i:用“ii”初始化,常量int“ci”再次用“ii”初始化,与“ri”类似

请注意,常量数据成员和引用必须是初始化列表,否则编译器将标记它

此外,数据成员的初始化顺序完全取决于它们在类中的声明方式(而不是它们在初始化列表中的显示方式)
。 考虑下面两个不同的场景: 场景1:

class constref
{
    public:
        constref(int ii):i(ii),ci(ii),ri(i)
        {
        }
    private:
        int i;
        const int ci;
        int &ri;
}
class constref
{
    public:
        constref(int ii):i(ii),ci(ii),ri(i)
        {
        }
    private:
        const int ci;
        int i;
        int &ri;
}
在这里,我将首先初始化ci和ri

场景2:

class constref
{
    public:
        constref(int ii):i(ii),ci(ii),ri(i)
        {
        }
    private:
        int i;
        const int ci;
        int &ri;
}
class constref
{
    public:
        constref(int ii):i(ii),ci(ii),ri(i)
        {
        }
    private:
        const int ci;
        int i;
        int &ri;
}

这里首先初始化ci,然后是i,ri。

首先,不需要提供默认构造函数,但如果不提供,则无法创建像
constref c1;
这样的对象,或者甚至无法创建像
constref c1[10]这样的对象数组
。创建类constref对象的唯一方法是向构造函数提供整数参数,即
constref c1(10);

其次,常量和引用在代码中不会初始化两次。它们只初始化一次,即INTEGET“i:用“ii”初始化,常量int“ci”再次用“ii”初始化,与“ri”类似

请注意,常量数据成员和引用必须是初始化列表,否则编译器将标记它

此外,数据成员的初始化顺序完全取决于它们在类中的声明方式(而不是它们在初始化列表中的显示方式)
。 考虑下面两个不同的场景: 场景1:

class constref
{
    public:
        constref(int ii):i(ii),ci(ii),ri(i)
        {
        }
    private:
        int i;
        const int ci;
        int &ri;
}
class constref
{
    public:
        constref(int ii):i(ii),ci(ii),ri(i)
        {
        }
    private:
        const int ci;
        int i;
        int &ri;
}
在这里,我将首先初始化ci和ri

场景2:

class constref
{
    public:
        constref(int ii):i(ii),ci(ii),ri(i)
        {
        }
    private:
        int i;
        const int ci;
        int &ri;
}
class constref
{
    public:
        constref(int ii):i(ii),ci(ii),ri(i)
        {
        }
    private:
        const int ci;
        int i;
        int &ri;
}

这里将首先初始化ci,然后是i,ri。

没有冲突:初始值设定项列表既可以与空的
{}
主体一起使用,也可以与带语句的构造函数主体一起使用。

初始值设定项列表只会在构造函数开头将成员初始化为特定值

即使构造函数有一个初始值设定项列表,您仍然可以自由地在构造函数主体中执行其他工作

这:

相当于:

Point(int i = 0, int j = 0) {
        x = i;
        y = j;
    }
只有在将不同数量的变量传递到构造函数以初始化类时,您才会有不同的构造函数方法。任何具有参数的构造函数都可以采用初始值设定项列表


默认构造函数是不接受任何参数的构造函数

您只需要在以下情况下定义默认构造函数 类的对象需要在没有任何参数的情况下实例化

参考资料:


没有冲突:初始值设定项列表既可以与空的
{}
主体一起使用,也可以与带语句的构造函数主体一起使用。

初始值设定项列表将在开始时将成员初始化为特定值