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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
#1

Вопрос про конструктор и инициализвцию - C++

14.10.2010, 13:56. Просмотров 1244. Ответов 20
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
class test {
int a;
char name[10];
string name2;
public: test(int a,char* name,[B] ....[/B]) : a(a), [B].....[/B]{}
 
};
если стринг как параметр то что писать в прототипе?
и как быстро инициализировать чар и стринг? strcpy не хочу, мне нужен быстрый способ и как он кстати по нормальному называется?)

Добавлено через 2 часа 10 минут
upppppp
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2010, 13:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос про конструктор и инициализвцию (C++):

Вопрос про конструктор - C++
цитата исходного кода из книги: class stock{ ... public: stock(); //Типа объявление конструктора по умолчанию чтоли... ...

Вопрос про конструктор - C++
Обязательно ли делать конструктор по умолчанию для класса, экземпляр которого входит в другой класс? Например так: class Class2 ...

Вопрос про конструктор класса по умолчанию - C++
http://s2.ipicture.ru/uploads/20111029/A7AtbNYV.jpg Пункт первый не могу немного понять.Т.е получается,что всегда лучше создавать самому...

Конструктор копирования(быстрый вопрос) - C++
Вроде бы все просто и логично, но в итоге выполнения B не копируется в A :C why? #include <iostream> using namespace std; class...

Инициализация массива через конструктор. Вопрос. - C++
Всем привет. Есть скудная вытяжка из методички: "Массив объектов В случае, когда возникает необходимость иметь несколько объектов...

Про конструктор копирования, оператор присваивания - C++
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что указывает указатель this в этих функциях?...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
14.10.2010, 14:02 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class foo
{
 
public:
  foo(const char* str)
    : bar(str) {}
 
  foo(const std::string& str)
    : bar(str) {}
 
private:
   std::string bar;
};
Цитата Сообщение от Krist_ALL Посмотреть сообщение
и как быстро инициализировать чар и стринг?
У std::string есть перегруженные конструкторы, котороые принимают const char* и const std::string& :
C++
1
2
3
const char* mes = "message";
std::string foo(mes);
std::string bar(foo);
Встречный вопрос: зачем в одном классе смешивать строки С со строками С++?
1
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
14.10.2010, 14:29  [ТС] #3
если я передаю в конструктор чар и в привате тоже чар то чтото не получается...
C++
1
2
char na[10];
public: foo(const char* name): na(name) {}
error C2536: 'foo::na' : cannot specify explicit initializer for arrays


C++
1
2
string na[10];
public: foo(const std::string& name): na(name) {}
error C2536: 'foo::na' : cannot specify explicit initializer for arrays


C++
1
2
3
4
5
6
7
int main() {
 
char* a = "test";
foo lol(a);
 
return 0;
}
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
14.10.2010, 14:34 #4
Цитата Сообщение от Krist_ALL Посмотреть сообщение
если я передаю в конструктор чар и в привате тоже чар то чтото не получается...
Если бы ты посмотрел внимательно, то ты бы увидел, что:
Цитата Сообщение от Nameless One Посмотреть сообщение
У std::string есть перегруженные конструкторы, котороые принимают const char* и const std::string&
Т.е. я говорил про std::string, а не про char. char - это тип языка Си, а не С++, у него конструкторов нет. Поэтому глупо пытаться инициализировать объект char объектом string.
1
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
14.10.2010, 14:47  [ТС] #5
непойму никак( хелп. нада чар в класс и стринг в класс
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
14.10.2010, 16:36 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class foo
{
    const char* bar;
 
public:
    foo(const char* str)
        : bar(str) {}
 
    friend std::ostream& operator << (std::ostream& os, const foo& rhs)
    {
        os << rhs.bar;
        return os;
    }
};
 
int main()
{
    foo bar("foobar");
    std::cout << bar << std::endl;
    return 0;
}
1
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 13:28  [ТС] #7
почему во всех выше примерах const char* а не char*?
у меня прекрасно работает конструктор с аргуменотом без const...
а если писать const char* то и в приват зоне тоже нужно будет писать конст а может я захочу изменит потом переменную и не смогу(



C++
1
2
3
4
5
6
class stock {
char* name;
 public:    stock(  char* name) :name(name) {   }
    void show() { cout <<name;}
 
};
я не указал размер char* name- понятно что это указатель но куда пишутся данные? ведь указатель хранит адрес данных а не сами данные.
а если писать в пирвате char name[20] то какой тип аргумента писать констуткторе?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
19.10.2010, 13:35 #8
Цитата Сообщение от Krist_ALL Посмотреть сообщение
почему во всех выше примерах const char* а не char*?
у меня прекрасно работает конструктор с аргуменотом без const...
а если писать const char* то и в приват зоне тоже нужно будет писать конст а может я захочу изменит потом переменную и не смогу(
Если тебе нужно изменять, то тогда придется выделять память под строку либо статически, либо динамически, и делать копирование функцией strсpy
Цитата Сообщение от Krist_ALL Посмотреть сообщение
я не указал размер char* name- понятно что это указатель но куда пишутся данные? ведь указатель хранит адрес данных а не сами данные.
а если писать в пирвате char name[20] то какой тип аргумента писать констуткторе?
Я открою тебе секрет, но в таком коде
C++
1
2
3
const char* str1;
char* str2;
char str3[80];
и str1, и str2, и str3 - это указатели. Даже более того, можно сказать, что в С/С++ массивов нет!

Добавлено через 36 секунд
Цитата Сообщение от Nameless One Посмотреть сообщение
а если писать в пирвате char name[20] то какой тип аргумента писать констуткторе?
Все тот же const char*
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 14:39  [ТС] #9
пишу в аргументе контсруктора char* name и норм пашет.
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
19.10.2010, 15:18 #10
Цитата Сообщение от Krist_ALL Посмотреть сообщение
пишу в аргументе контсруктора char* name и норм пашет.
а вот такая программа приводит к segmentation fault:
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
#include <iostream>
 
class foo
{
public:
    foo ( char* str )
        : name ( str ) {}
 
    void bar()
    {
        *name = 'b';
    }
 
    void print()
    {
        std::cout << name << std::endl;
    }
 
private:
    char* name;
};
 
 
int main()
{
    foo f ( "alskdgl;bn;a lslvjl lsdhlvm l alj lmvalh ljm l" );
    f.print();
    f.bar();
    f.print();
    return 0;
}
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 19:03  [ТС] #11
запустил и вывалилась ошибка. непойму из за чего)

*name = 'b'; это допустимо вполне.
если можно разъясните плз.

заменил char* На стринг - все ок без ошибок.

и еще : вот мы записали в *name длинное слово без \0 и читает - мы можем прочитать намного боьше чем нужно cout кончает когда встретит \0 да?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
19.10.2010, 19:55 #12
Цитата Сообщение от Krist_ALL Посмотреть сообщение
*name = 'b'; это допустимо вполне.
Нет, так делать нельзя, потому что в данном случае name - это указатель на строковую константу (строковый литерал) "alskdgl;bn;a lslvjl lsdhlvm l alj lmvalh ljm l", которую, как известно, менять нельзя - происходит попытка произвести запись в область памяти, доступную только для чтения.

Чтобы такого не было, нужно, чтобы в name хранилась копия этой строки, для чего и нужно использовать функцию strcpy, предварительно выделив память под строку (статически - объявив name как "char name[число элементов];", либо динамически - объявив name как "char* name" и выделив ему в конструкторе память перед копированием с помощью оператора new)

Цитата Сообщение от Krist_ALL Посмотреть сообщение
заменил char* На стринг - все ок без ошибок.
естественно - там как раз работает вышеописанная схема (т.е. разработчики класса за тебя позаботились о выделении памяти и копировании строки)

Цитата Сообщение от Krist_ALL Посмотреть сообщение
и еще : вот мы записали в *name длинное слово без \0 и читает - мы можем прочитать намного боьше чем нужно cout кончает когда встретит \0 да?
не понял
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
19.10.2010, 21:13  [ТС] #13
ой как сложно)))
и все же я считаю что проще писать в аргументе char* просто без const далее name(name) и все
просто я обожаю краткую форму инициализации)


при char*name какой длинны я могу записывать данные? я делаю просто name(name) а про длинну хз.
конечно можно strncpy но мне всеж проще как я люблю.

ия почемуто немогу менять данные в name как мне присвоить новое значение name ?

в прошлом твоем примере нет упоминания про CONST CHAR* везде просто char а ошиька всеж вылетает
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
20.10.2010, 03:22 #14
Цитата Сообщение от Krist_ALL Посмотреть сообщение
ой как сложно)))
и все же я считаю что проще писать в аргументе char* просто без const далее name(name) и все
просто я обожаю краткую форму инициализации)
Дело твое, только не жалуйся потом, что у тебя программы вылетают

Цитата Сообщение от Krist_ALL Посмотреть сообщение
конечно можно strncpy но мне всеж проще как я люблю.
ты еще скажи, что функцию strcpy написали зря и она никому не нужна

Цитата Сообщение от Krist_ALL Посмотреть сообщение
ия почемуто немогу менять данные в name как мне присвоить новое значение name ?
см. мой пост выше

Цитата Сообщение от Krist_ALL Посмотреть сообщение
в прошлом твоем примере нет упоминания про CONST CHAR* везде просто char а ошиька всеж вылетает
а там хоть char*, хоть const char* - все равно будет вылетать ошибка. Здесь главное не то, какой указатель, а то, каким значением оно инициализируется - строковым литералом (константой). Это будет равносильно такому участку программы:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main ( void )
{
    // Здесь "Hello, World!" - строковая константа
    // str инициализируется адресом из области памяти, доступной только для чтения
    // Любая попытка записи в этой области приведет к ошибке сегментации
    char* str = "Hello, World!";
    str[3] = '%'; // Ошибка!
    return 0;
}
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
20.10.2010, 12:35  [ТС] #15
и как же поступать мне?
начал вникат в суть проблемы..

делать *name = "b"; ?
а если const char* name то одни ошибки
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2010, 12:35
Привет! Вот еще темы с ответами:

Вопрос про указатели - C++
#include &lt;iostream.h&gt; int main() { int x; int *Pointer; pointer = &amp;x; cout &lt;&lt; pointer; cout &lt;&lt; *ponter; return 0; ...

Вопрос про консоль - C++
День добрый. Я новичок в программировании и пишу консольную программу.Хотелось бы узнать у более опытных товарищей. Как сделать так,...

вопрос про скобки - C++
Здравствуйте, получил задание написать программу, смысл которой заключается в умножении матрицы на столбец. Матрица статическая, функция...

Вопрос про цикл for - C++
Скажите, а есть ли какая-то разница в записях: for (int i=0; i&lt;n; i++) и for (int i=0; i&lt;n; ++i) Спасибо.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.10.2010, 12:35
Ответ Создать тему
Опции темы

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