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

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

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

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

14.10.2010, 13:56. Просмотров 1239. Ответов 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
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
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
20.10.2010, 12:51 #16
Цитата Сообщение от Krist_ALL Посмотреть сообщение
и как же поступать мне?
начал вникат в суть проблемы..
Вот так:
Цитата Сообщение от Nameless One Посмотреть сообщение
Чтобы такого не было, нужно, чтобы в name хранилась копия этой строки, для чего и нужно использовать функцию strcpy, предварительно выделив память под строку (статически - объявив name как "char name[число элементов];", либо динамически - объявив name как "char* name" и выделив ему в конструкторе память перед копированием с помощью оператора new)
Цитата Сообщение от Krist_ALL Посмотреть сообщение
делать *name = "b"; ?
а если const char* name то одни ошибки
почитай лучше какую-нибудь хорошую книжку по Си/С++, реально поможет
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
20.10.2010, 13:37  [ТС] #17
C++
1
2
3
4
public:  foo (const char* str ) { 
    strcpy(name,str);       }
...
 *name = "b"
cannot convert from 'char [2]' to 'char'
выделить память не понял как. знаю что через new но длинну то как мы определим?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.10.2010, 13:44 #18
Krist_ALL, name - указатель на первый символ строки, разыменуя его мы получим первый символ. Вопрос: что ты хотел сказать присваивая символу строку "b"?

Не по теме:

Все таки почитай хоть какую нибудь книгу по СИ/С++.

Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
20.10.2010, 13:46 #19
Цитата Сообщение от Krist_ALL Посмотреть сообщение
public: foo (const char* str ) {
strcpy(name,str); }
...
*name = "b"
cannot convert from 'char [2]' to 'char'
Krist_ALL, а ты знаешь, в чем разница между строкой и символом? "b" - это строка, а 'b' - это символ. О чем тебе компилятор и сообщил, только ты не понял
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
#include <iostream>
#include <stdexcept>
#include <cstring>
 
class foo
{
public:
    foo ( const char * str )
    {
        if ( strlen ( str ) >= 10 )
            throw std::runtime_error ( "Error" );
        strcpy ( name, str );
    }
 
    void bar()
    {
        name[0] = 'b'; // Равносильно *name='b'
    }
 
    void print()
    {
        std::cout << name << std::endl;
    }
 
private:
 
    char name[10];
};
 
int main()
{
    foo f ( "test" );
    f.print();
    f.bar();
    f.print();
 
    return 0;
}
Цитата Сообщение от Krist_ALL Посмотреть сообщение
но длинну то как мы определим?
strlen
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
20.10.2010, 19:46  [ТС] #20
так. осталось совсем чуть чуть чтобы закрыть совсем тему)


Nameless One, твой пример будет пахать даже если аргумент конструктора просто char* - непойму никак смысл const char*...(

быстая инициализация для char невозможна?


напиши плз код где в private char* и в констуркторе выделяется нужное колво памяти.

Добавлено через 5 минут
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
#include <iostream>
#include <stdexcept>
#include <cstring>
 
class foo
{
public:
    foo ( const char * str )
    {
        //strcpy ( name, str );
        //strcpy(foo::name,name);
        char* name = new char[strlen(str)];
    }
 
    void bar()
    {
       // name[0] = 'b'; // ГђГ*ГўГ*îñèëüГ*Г® *name='b'
      // *name='b';
    }
 
    void print()
    {
        std::cout << name << std::endl;
    }
 
private:
 
  // char name[10];
    char *name;
};
 
int main()
{
    foo f ( "test" );
    f.print();
    f.bar();
    f.print();
 
    return 0;
}
программа грохается
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
21.10.2010, 05:28 #21
Цитата Сообщение от Krist_ALL Посмотреть сообщение
быстая инициализация для char невозможна?
для char (одного символа) - возможна, для строки (массива символов) - нет, т.к. строка одновременно является указателем.

Цитата Сообщение от Krist_ALL Посмотреть сообщение
программа грохается
Замени строку 13 на
C++
1
name = new char[strlen(str) + 1];
Нужно дополнительно резервировать место для символа '\0' - нуль терминатора, которым кончаются строки Си, т.к. функция strlen его не считает. И да, если в конструкторе выделил память, то в деструкторе ее надо освобождать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2010, 05:28
Привет! Вот еще темы с ответами:

Вопрос про указатели - 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
Объявления
21.10.2010, 05:28
Ответ Создать тему
Опции темы

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