Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.78
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
#1

Константные поля класса - C++

16.03.2012, 02:22. Просмотров 3844. Ответов 15
Метки нет (Все метки)

Такой вопрос, как инициализировать константные поля класса? Работают конструкции вида obj():t(0){}; который используется в примере ниже. А если написать полноценное тело конструктора, то пишет что нельзя модифицировать константу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class obj{
    const int t;
    const char* str;
    obj():t(0){};
    obj(const int p,  char* pstr):
        t(p),
        str(pstr)
    {};
    ~obj(){
        delete [] str;
    }
};
Не совсем уверен правильность деструктора, но вылетает с ошибкой.

В особенности интересует можно ли как нибудь задать и заполнить поле класса const char* str;
str должна быть произвольного размера
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 02:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Константные поля класса (C++):

Константные поля и методы - C++
А можете объяснить, что такое константные поля и методы в классах?

Константные статические объекты класса. - C++
Здравствуйте. Есть класс &quot;матрица&quot; нужно задать константные матрицы такие как E - единичная матрица и т.д., как это сделать? #include...

Константные методы и объекты класса - C++
Это необходимость, или явная подстраховка того, что бы объект (константный) работал с себе подобными методами класса ?

Константные поля и операция присвоения - как быть? - C++
У меня в классе реализовано константное поле: int const constant; инициализация такой переменной происходит в конструкторе в списке...

Константные и не константные ссылки. Приведения типов. Нужно уточнение - C++
Не очень понимаю в чем различие (2,3 строчки). int x = 10; double &amp;y = x; const double &amp;y = x; Почему для не...

Где инициализировать константные данные класса? - C++
Вот ошибка: в пределах класса могут быть инициализированы только статестические константы данные-члены целого типа. private: string...

15
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:35 #2
Поля, инициализируемые при помощи синтаксиса списка инициализации получают свое значение еще до входа в тело конструктора. Присваивание константе значения в теле конструктора уже является именно ПРИСВАИВАНИЕМ, что по определению не возможно для константы.
0
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
16.03.2012, 02:35  [ТС] #3
Не уверен потому что не было оператора new, мне думается что str статическая. Хотя:
C++
1
2
    char* str1="FDSF";
    delete [] str1;
работает.

Konstantin_D, а вы не знаете в деструкторе нужен delete?
0
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:42 #4
при наличии в деструкторе оператора delete[], все конструкторы должны выделять память оператором new[]. При этом условии деструктор правильный. Если создаешь пустую строку, все равно в конструкторе пиши
C++
1
str = new char[1]; str[0]='\0';
Зачем тебе указатель на константную строку?

Добавлено через 1 минуту
зачем освобождать память, которую не выделял динамически?
0
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
16.03.2012, 02:44 #5
рекомендую конструкторы всётаки в public
0
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 02:57 #6
Цитата Сообщение от besh
<a;2799674]мне думается что str статическая
статической она станет(переменная str) как только ты ее объявишь статической
C++
1
static char* str;
Добавлено через 4 минуты
А что вообще нужно реализовать?

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstring>
 
class Str
{
    char* str;
    Str(const Str& s);
    Str& operator=(const Str& s) {return *this;}
public:
    Str();
    Str(const char* pch);
    ~Str() {delete[] str;}
};
Str::Str()
{
    str = new char[1];
    str[0] = '\0';
}
Str::Str(const char* pch)
{
    str = new char[strlen(pch)+1];
    strcpy(str,pch);
}
0
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
16.03.2012, 03:04  [ТС] #7
Меня интересовала инициализация константных динамических массивов, так что ли сказать. Видимо такого вообще не бывает.
0
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
16.03.2012, 03:08 #8
тут разве не динамический массив? Размер массива зависит от того чем инициализируют
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class obj{
        const int t;
        const char* str;
public:
        obj():t(0){};
        obj(const int p,  char* pstr) :
                t(p),
                str(pstr)
        {};
};
int main()
{
    obj test(2231,"lemasdasdasdingi");
    obj * asdas = new obj();
    obj * asd   = new obj(5,"1234");
 
    delete asdas;
    delete asd;
    return 0;
}
В примере Константина еще динамичней
0
Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 03:08 #9
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Str& operator=(const Str& s) {return *this;}
Я конечно извиняюсь, но в чем суть такого оператора?О_о
0
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
16.03.2012, 03:11 #10
Цитата Сообщение от Russian_Dragon Посмотреть сообщение
Я конечно извиняюсь, но в чем суть такого оператора?О_о
Иначе будет будет использоваться стандартный конструктор копирования.
В "Прата С. - Язык программирования С++. Лекции и упражнения" глава была этому посвящена, с разбором возможных ошибок из-за стандартного конструктора копирования.
0
Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 03:21 #11
Цитата Сообщение от besh]<a Посмотреть сообщение
Меня интересовала инициализация константных динамических массивов, так что ли сказать. Видимо такого вообще не бывает.
В С++ можно всё, просто нужно знать как.

По идее такое вряд ли нужно, но это можно сделать так:
C++
1
2
3
template<int t, char* str>
class obj{
}
Добавлено через 5 минут
Цитата Сообщение от Cool-T Посмотреть сообщение
Иначе будет будет использоваться стандартный конструктор копирования.
В "Прата С. - Язык программирования С++. Лекции и упражнения" глава была этому посвящена, с разбором возможных ошибок из-за стандартного конструктора копирования.
Ну тогда так и пиши.
C++
1
2
3
4
5
Str& operator=(const Str& s) {
delete str;
str = new char[strlen(s.str)+1];
        strcpy(s.str,pch);
}
А у тебя фигня выходит. Получается, что операция копирования информации, не будет выполнена.
0
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 03:22 #12
C++
1
Str& operator=(const Str& s) {return *this;}
если этого не сделать, то будет использоваться оператор присваивания, заданный по умолчанию, выполняющий поэлементное присваивание. А этого в данном случае допустить нельзя!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cstring>
using std::endl;
using std::cout;
using std::ostream;
 
class Str
{
    char* str;
    Str(const Str& s);
    Str& operator=(const Str& s) {return *this;}
public:
    Str();
    Str(const char* pch);
    ~Str() {delete[] str;}
    friend ostream& operator<<(ostream& os, const Str& s);
};
Str::Str()
{
    str = new char[1];
    str[0] = '\0';
}
Str::Str(const char* pch)
{
    str = new char[strlen(pch)+1];
    strcpy(str,pch);
}
ostream& operator<<(ostream& os, const Str& s)
{
    os << s.str;
    return os;
}
int main()
{
    Str s2("Hello, World!");
    Str s1;
//  Str s1(s2);
//  s1 = s2;
    cout << "s1: *" << s1 << "*\n";
    cout << "s2: *" << s2 << "*\n";
}
Эти объявления делают конструктор копирования и оператор присваивания недоступными.
Попробуй поубирать комментарии в main()
0
Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 03:29 #13
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Эти объявления делают конструктор копирования и оператор присваивания недоступными.
А, ты просто блокируешь. Всё - согласен, никаких вопросов.
0
Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
16.03.2012, 03:29 #14
Лучше напиши так:
C++
1
2
3
4
5
6
7
8
9
10
11
Str& Str::operator=(const Str& s) 
{
    if (this == &s)
        return *this;
    
    delete [] str;
    str = new char[strlen(s.str)+1];
    strcpy(str,s.str);
 
    return *this;
}
0
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
16.03.2012, 03:58  [ТС] #15
Цитата Сообщение от Cool-T Посмотреть сообщение
тут разве не динамический массив? Размер массива зависит от того чем инициализируют
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class obj{
        const int t;
        const char* str;
public:
        obj():t(0){};
        obj(const int p,  char* pstr) :
                t(p),
                str(pstr)
        {};
};
int main()
{
    obj test(2231,"lemasdasdasdingi");
    obj * asdas = new obj();
    obj * asd   = new obj(5,"1234");
 
    delete asdas;
    delete asd;
    return 0;
}
В примере Константина еще динамичней
Я уже писал что меня смущает вот этот момент: const char* str; В данном случае ввиду отсутствия оператора new, str считается статическим массивам?
Ответ на этот вопрос решил бы все мои сомнения.
0
16.03.2012, 03:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2012, 03:58
Привет! Вот еще темы с ответами:

Константные функции-члены класса, возвращающие ссылку на константу - C++
Упражняюсь по книге Липпмана, выполняю задания по теме классы. Необходимо реализовать класс person, который способен хранить имя и адрес...

Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля. - C++
Помогите решить с объяснениями. Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля. ...

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

Друзья, подскажите, говорят, что можно поля класса инициализировать в момент объявления класса. Как это сделать? - C++
Скажу сразу, а то сейчас начнется, что я прекрасно понимаю, что поля класса при объявлении инициализировать нельзя. Можно конструктором при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru