55

最近我创建了类Square

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

class Square
{
    int m_row;
    int m_col;

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

==========cpp文件======

#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) {};
};

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

4

5 回答 5

77

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

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);
于 2013-03-11T09:40:19.750 回答
43

你可以有

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

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) 
{}
于 2013-03-11T09:38:54.830 回答
10

初始化列表与构造函数定义一起出现,而不是与不是定义的声明一起出现。因此,您的选择是:

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

于 2013-03-11T09:39:59.443 回答
3

不是要求。它也可以在源文件中实现。

// In a source file
Square::Square(int row, int col): m_row(row), 
                                  m_col(col) 
{}
于 2013-03-11T09:37:21.863 回答
0

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

于 2013-03-11T09:59:07.273 回答