Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构造函数中冒号后面的成员变量列表适用于什么? 我正在阅读这个C++源代码,我来到了一个构造函数,但我没有得到它(基本上因为我不知道C++:p)< /p>_C++_Constructor - Fatal编程技术网

构造函数中冒号后面的成员变量列表适用于什么? 我正在阅读这个C++源代码,我来到了一个构造函数,但我没有得到它(基本上因为我不知道C++:p)< /p>

构造函数中冒号后面的成员变量列表适用于什么? 我正在阅读这个C++源代码,我来到了一个构造函数,但我没有得到它(基本上因为我不知道C++:p)< /p>,c++,constructor,C++,Constructor,我非常了解C和Java TransparentObject::TransparentObject( int w, int x, int y, int z ) : _someMethod( 0 ), _someOtherMethod( 0 ), _someOtherOtherMethod( 0 ), _someMethodX( 0 ) { int bla; int bla; } 就我所能“推断”的而言,第一行只声明

我非常了解C和Java

 TransparentObject::TransparentObject( int w, int x, int y, int z ) : 
     _someMethod( 0 ),
     _someOtherMethod( 0 ),
     _someOtherOtherMethod( 0 ),
     _someMethodX( 0 ) 
  {
       int bla;
       int bla;
  }
就我所能“推断”的而言,第一行只声明了构造函数的名称:“::”听起来像是“属于”我。{}之间的代码是它自身的构造函数体

我“思考”PalRead之后的内容,第一个“{”类似方法默认参数或其他东西,但我在Web上找不到合理的解释。在例子中我发现的大多数C++构造函数与java中的几乎相同。 我的假设是对的?”::“是属于,参数和body后面的列表是“default args”还是什么

更新: 谢谢你的回答。
这些可能被称为方法吗?(我想不会),在构造函数体中调用它们有什么区别::实际上意味着包含(请参见注释以获得澄清),但是_someMethods等就是所谓的方法。链接中有大量信息=]


<>编辑:对不起,我的第一个句子是错误的-看到评论。

你是正确的。它是一种设置类变量的默认值的方法。我不太熟悉在函数中和函数函数之间的精确区别。

是,,是:C++范围操作符,它允许你告诉编译器函数是什么。longs to.在构造函数声明开始所谓的初始化列表后使用:参数列表和
{}
s之间的代码指定(某些)类成员的初始化


初始化与赋值不同——它们是不同的东西——因此这些都是对构造函数的调用。

最常见的情况是:

class foo{
private:
    int x;
    int y;
public:
    foo(int _x, int _y) : x(_x), y(_y) {}
}
这将
x
y
设置为构造函数参数中
\u x
\u y
中给定的值。这通常是构造声明为数据成员的任何对象的最佳方法

也可能您正在查看构造函数链接:

class foo : public bar{
    foo(int x, int y) : bar(x, y) {}
};
在本例中,类的构造函数将调用其基类的构造函数并传递值
x
y

要进一步剖析函数,请执行以下操作:

TransparentObject::TransparentObject( int w, int x, int y, int z ) : 
   _someMethod( 0 ),
   _someOtherMethod( 0 ),
   _someOtherOtherMethod( 0 ),
   _someMethodX( 0 ) 
{
     int bla;
     int bla;
}
::
-运算符被称为范围解析运算符。它基本上只是指示
透明对象
透明对象
的成员。其次,假设构造函数的主体出现在花括号中是正确的

{
   int bla;
   int bla;
}
更新:谢谢你的回答。这些可以被称为方法吗?(我想不是),在构造函数体中调用它们有什么区别


关于这个主题的信息比我所能提供的要多得多。你必须使用初始值设定项列表的最常见的领域是当你初始化一个引用或一个
常量时,因为这些变量必须在创建时立即被赋予一个值。

你已经非常接近了。第一行是声明::左边的标签是类名,要使其成为构造函数,函数名必须与类名相同

TransparentObject::TransparentObject( int w, int x, int y, int z )
<>在C++中,您可以在函数体的开始之前为成员变量选择冒号和一些初始值。如果初始化任何“强> > const <强>变量或传递参数到超类构造函数,就必须使用此技术。

: 
 _someMethod( 0 ),
 _someOtherMethod( 0 ),
 _someOtherOtherMethod( 0 ),
 _someMethodX( 0 )
然后是用大括号括起来的构造函数主体

{
   int bla;
   int bla;
}

使用初始化列表通常有一些很好的理由。例如,您不能设置构造函数初始化列表之外的引用成员变量。此外,如果成员变量需要某些参数到其自己的构造函数,您必须在此处传递这些参数。比较:

class A
{
public:
  A();
private:
  B _b;
  C& _c;
};

A::A( C& someC )
{
  _c = someC; // this is illegal and won't compile. _c has to be initialized before we get inside the braces
  _b = B(NULL, 5, "hello"); // this is not illegal, but B might not have a default constructor or could have a very 
                            // expensive construction that shouldn't be done more than once
}
对于此版本:

A::A( C& someC )
: _b(NULL, 5, "hello") // ok, initializing _b by passing these arguments to its constructor
, _c( someC ) // this reference to some instance of C is correctly initialized now
{}

如果不使用初始化器列表,所有类成员将只调用其默认构造函数,因此这是唯一可以控制调用哪个构造函数的位置(对于非动态分配的成员)。对于调用哪个父类构造函数也是如此

类成员在构造函数主体内“初始化”(即使用=运算符在{}括号之间)从技术上讲,它不是初始化,而是赋值。对于具有非平凡构造函数/析构函数的类,默认构造然后以这种方式通过赋值进行修改的代价可能会很高。对于引用成员,您必须使用初始化器列表,因为它们不能通过赋值运算符进行更改

如果成员(或父类)没有默认构造函数,则未能在初始化器列表中指定适当的构造函数将导致编译器生成错误。否则,编译器将插入默认构造函数调用本身。对于内置类型,这不起任何作用,因此将在其中包含垃圾值

请注意,在初始化器列表中指定成员的顺序不影响调用它们的顺序。它始终是父类构造函数(如果有)首先,然后是类成员在类定义中的定义顺序。将它们放入初始值设定项列表中的顺序无关紧要,可能是细微错误的来源

在下面的人为示例中,其意图似乎是使用
value
初始化
mub
,然后使用
mub
初始化
mua
,但实际情况是
mua
使用
mub
初始化(其本身尚未初始化)然后用
value
初始化
mub
mub
将只包含垃圾

struct BadInitialiserListExample
{
    BadInitialiserListExample(int value) :
        m_b(value),
        m_a(m_b)      // <-- *BUG* this is actually executed first due to ordering below!
    {
    }

    int    m_a;
    int    m_b;
};
struct badInitializerListExample
{
BadInitializerListExample(int值):
m_b(值),
M