Есть ли проблема вызова функций в списке инициализации? - PullRequest
7 голосов
/ 10 октября 2010

Я пишу этот конструктор копирования:

//CCtor of RegMatrix                    
RegMatrix::RegMatrix(const RegMatrix &other){

    this-> numRow = other.getRow();
    this-> numCol = other.getCol();

    //Create
    _matrix = createMatrix(other.numRow,other.numCol);

    int i,j;

    //Copy Matrix
    for(i=0;i<numRow; ++i){
        for(j=0;j<numCol; ++j){
            _matrix[i][j] = other._matrix[i][j];
        }
    }
}

Есть ли проблема для инициализации numRow, numCol в списке инициализации следующим образом: numRow(other.numRow), numCol(other.numCol) вместо:

this-> numRow = other.getRow();
this-> numCol = other.getCol();

Кроме того, я не знаю, если такой проблемы нет, есть ли проблема вызова функции объекта других классов в списке инициализации, например:

numRow(other.getRow())

вместо:

this-> numRow = other.getRow();

Ответы [ 2 ]

11 голосов
/ 10 октября 2010

Есть ли проблема для инициализации numRow, numCol в списке инициализации [...]?

В общем , естьдве проблемы с этим:

  1. При инициализации объектов в списке инициализации объект еще не полностью построен.Поэтому, когда вы вызываете нестатические функции-члены, вы вызываете их для еще не полностью построенного объекта .Если эти функции пытаются использовать любой подобъект объекта, который не был создан, вы вызываете Неопределенное поведение .
  2. Порядок инициализации - это порядок объявления членов в определении класса , это , а не порядок, в котором они перечислены в списке инициализации .Поэтому вам необходимо обратить внимание на инициализацию членов, требующих данных от других участников.(Это можно рассматривать как подзадачу предыдущего: использование еще не созданных подобъектов.) Лучше избегать таких ситуаций, но если их нельзя избежать, добавьте большой, страшный комментарий к тому, где члены объявленыв определении класса, подчеркивая важность их порядка.

В вашем конкретном примере это не имеет значения, поэтому вы в безопасности , чтобы сделать это,

2 голосов
/ 10 октября 2010

Нет, на самом деле проблем нет.За исключением этого, будьте осторожны, что порядок инициализации НЕ является порядком, в котором вы указываете инициализаторы в списке инициализации.Порядок, в котором ваши члены были объявлены в классе.Кроме этой потенциальной проблемы, я не вижу ни одной.НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...