是否需要在头文件中定义初始化列表?

时间:2013-03-11 09:35:54

标签: c++ initialization-list

最近我创建了课程Square

=========头文件======

class Square
{
    int m_row;
    int m_col;

public:
    Square(int row, int col): m_row(row), m_col(col) 
};

========== cpp file ======

#include "Square.h"

Square::Square(int row, int col)
{
    cout << "TEST";
}

然后我收到很多错误。如果我删除cpp文件并将头文件更改为:

=========头文件======

class Square
{
    int m_row;
    int m_col;

public:
    Square(int row, int col): m_row(row), m_col(col) {};
};

它没有错误。这是否意味着初始化列表必须出现在头文件中?

5 个答案:

答案 0 :(得分:51)

初始化列表 是构造函数定义的一部分,因此您需要在定义构造函数体的同一位置定义它。 这意味着您可以在头文件中使用它:

public:
    Square(int row, int col): m_row(row), m_col(col) {};

或.cpp文件:

Square::Square(int row, int col) : m_row(row), m_col(col) 
{
    // ...
}

但是当您在.cpp文件中定义时,那么在头文件中,应该只有它的声明:

public:
    Square(int row, int col);

答案 1 :(得分:31)

你可以拥有

==============头文件================

class Square
{
    int m_row;
    int m_col;

public:
    Square(int row, int col);
};

================== cpp ====================

Square::Square(int row, int col):m_row(row), m_col(col) 
{}

答案 2 :(得分:8)

初始化列表带有构造函数定义,而不是带有非定义的声明。所以,你的选择是:

Square(int row, int col): m_row(row), m_col(col) {}; // ctor definition

在类定义中,否则:

Square(int row, int col); // ctor declaration

在类定义中:

Square::Square(int row, int col): m_row(row), m_col(col) {} // ctor definition

别处。如果你设置inline,则允许“其他地方”在标题中。

答案 3 :(得分:3)

不是必需品。它也可以在源文件中实现。

// In a source file
Square::Square(int row, int col): m_row(row), 
                                  m_col(col) 
{}

答案 4 :(得分:0)

这种初始化变量称为成员初始化列表。成员初始化列表可以在头文件或源文件中使用。那没关系。但是在头文件中初始化它时,构造函数必须有定义。您可以参考C++ Member Initialization List了解更多详情。