Конструктор копирования преобразует из const в не-const? - PullRequest
1 голос
/ 01 сентября 2011

Рассмотрим следующее:

class A
{
public:
    int xx;
    A(const A& other)
    {
        cout << "A cctor" << endl;
        /*  do some stuff */
    }

    A(int x) : xx(x) {}  /* conversion constructor */

    };


int main()
{    
    A a = 1;
    A other = a;
    return 0;
}

Правильно ли говорить, что в этом случае CCtor преобразуется из const в не-const (и в целом)?

Спасибо, Рон

Ответы [ 7 ]

5 голосов
/ 01 сентября 2011

Конструктор копирования создает новую копию существующего объекта, этот объект может или не может быть постоянным.Константа в A::A(const A& other) просто говорит о том, что мы не собираемся менять other в копирующем ctor.В самом деле, если вы попытаетесь изменить другое внутри ctor, компилятор будет стонать на вас.

Созданный объект также может или не может быть постоянным в зависимости от того, как вы его объявили.

0 голосов
/ 01 сентября 2011

В том смысле, что конструктор A(int) конвертирует из int в A, да, это правда, что ваш экземпляр ctor A(const A&) "конвертирует" из const A в A. В этом отношении он также «конвертирует» из неконстантного A в A, поскольку ссылочный параметр const может связываться с любым из них.

И поскольку для создания const-объекта используется тот же конструктор, что и для создания неконстантного, этот экземпляр ctor также может «преобразовывать» из A или const A в const A.

Я использовал «преобразование» в кавычках только потому, что преобразование из типа в себя или в версию с квалификацией cv, возможно, вводит в заблуждение использование термина, обычно вы просто называете это «копированием», а не преобразованием.

Параметр конструктора может также привязываться к экземпляру производного класса A, поэтому вы можете сказать, что он преобразует производные классы в A. Обычно это называется "нарезка".

Строго говоря, не сам копирующий ctor конвертирует что-либо, но преобразование в A (независимо от того, является ли это приведение или неявное преобразование) зависит от использования соответствующего конструктора. Поэтому я полагаю, что конструктор может потребовать большую часть кредита.

0 голосов
/ 01 сентября 2011

Нет, это не преобразование в не const объект. Учтите это:

A a(42);
const A another = a;

Здесь another - это const объект, созданный из не const объекта.

Более важно, однако, что конструктор создает новый объект из существующего. Является ли этот новый объект const или нет, не зависит от существующего объекта. Все четыре возможных комбинации const / не- const старых / новых объектов возможны.

0 голосов
/ 01 сентября 2011

Понятия не имею, что вы имеете в виду. A(const A&) - это типичный copy-ctor, который имеет доступ «только для чтения» к своему единственному аргументу. Если вы передаете что-либо const, все в порядке. Если вы передаете что-то неконстантное, для ctor оно становится константным. A a = 1 - это коэффициент преобразования, как вы сказали. A other = a это копия ctor. Что за вопрос?

Что касается названия вашего вопроса, в C ++ нет честного способа конвертировать const в не- const.

class A
{
public:
    int xx;
    A(const A& other)
    {
        cout << "A cctor" << endl;
        /*  do some stuff */
        // other is const here - you can only call its
        // const methods and read all its data members            
    }

    A(int x) : xx(x) {}  /* conversion constructor */
        // at this point, x is not const, but it's a copy
        // of an object you've passed here, not the object itself
        // you can change x, it just doesn't matter - you
        // change the copy
    };


int main()
{    
    A a = 1; // a is not const, 1 is passed "by value", since it's primitive type
    A other = a; // a is not const, other is not const, a is passed by const reference
    return 0;
}
0 голосов
/ 01 сентября 2011

Нет, конструктор копирования создает копию объекта класса, принимая в качестве параметра другой объект класса.

Поскольку для создания нового объекта, передаваемого в качестве параметра, не требуется его изменение, он передаетсякак const.

0 голосов
/ 01 сентября 2011

Что вы подразумеваете под Преобразователь CCtor из константного в неконстантный ?

Если вы имеете в виду, неконстантный объект создается из константного объекта путем вызова конструктора копирования, тогда да. Но это не означает, что сам const-объект становится неконстантным внутри конструктора копирования (или на сайте вызова). Это означает только то, что вновь созданный объект создается путем копирования существующего объекта, который передается как константная ссылка в конструктор копирования.

0 голосов
/ 01 сентября 2011

Конструктор инициализирует новую копию. И нет проблем с копированием из константы.

Нет преобразования.

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