Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2014, 20:55   #1
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию static В функции

Код:
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;

class book;

class librarian{
public:
void change_catalog(book*, char*);
char* get_catalog(book);
};


class book{
public:
book(char*, char*, char*) ;
void show_book (void);
friend char* librarian::get_catalog(book);
friend void librarian::change_catalog(book*, char*);
private:
char title[64];
char author[64];
char catalog[64];
};


book::book(char* title, char* author, char* catalog){
strcpy(book::title, title);
strcpy(book::author, author);
strcpy(book::catalog, catalog);
}


void book::show_book(void){
cout << "Nazvanie: " << title << endl;
cout << "Autor: " << author << endl;
cout << "Catalog: " << catalog << endl << endl;
}

void librarian::change_catalog(book* this_book, char* new_catalog){
strcpy(this_book->catalog, new_catalog) ;
}

char* librarian::get_catalog(book this_book){
static char catalog[64];
strcpy(catalog, this_book.catalog);
return(catalog);
}


void main(void){
book programming( "U4ims9 programmirovat' na C++", "Jamsa", "P101");
librarian library;
programming.show_book();
library.change_catalog(&programming, "Legkiy C++ 101");
library.get_catalog(programming);
programming.show_book();

char ch = getchar();
}
----------------------------------------------

Что то понять не могу, функция
Код:
char* librarian::get_catalog(book this_book){
static char catalog[64];
strcpy(catalog, this_book.catalog);
return(catalog);
}
static char catalog[64]; - что значит статик в данном случае, просто я знаю про статик, когда элементы класса статическими объявляют, а тут НЕПОНЯТНО !!!
Почему возвращаемое значение типа char, а не *char ???
zla9_kolu4ka вне форума Ответить с цитированием
Старый 01.03.2014, 21:40   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Это статическая локальная переменная.
Streletz вне форума Ответить с цитированием
Старый 02.03.2014, 12:43   #3
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию

Почему возвращаемое значение типа char, а не *char ???
zla9_kolu4ka вне форума Ответить с цитированием
Старый 02.03.2014, 13:33   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Возвращается как и положено char*, а вот что вы хотели сказать этим *char не ясно...
p51x вне форума Ответить с цитированием
Старый 02.03.2014, 15:06   #5
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию

Цитата:
Почему возвращаемое значение типа char, а не *char ???
не то, вот
Почему возвращаемое значение типа char, а не char* ???
catalog же имеет тип char а не char*
Код:
char* librarian::get_catalog(book this_book){
static char catalog[64];
strcpy(catalog, this_book.catalog);
return(catalog);
}
zla9_kolu4ka вне форума Ответить с цитированием
Старый 02.03.2014, 16:06   #6
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Функция возвращает правильное значение.
Код:
char* a;
и
Код:
char a[];
Это, по сути, одно и тоже.
Streletz вне форума Ответить с цитированием
Старый 02.03.2014, 16:08   #7
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию

Код:
void librarian::change_catalog(book* this_book, char* new_catalog){
strcpy(this_book->catalog, new_catalog) ;
}
Код:
char* librarian::get_catalog(book this_book){
static char catalog[64];
strcpy(catalog, this_book.catalog);
return(catalog);
}
this_book.catalog
Vs
this_book->catalog

Почему по разному идет доступ ???
zla9_kolu4ka вне форума Ответить с цитированием
Старый 02.03.2014, 16:11   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Потому что в одном случае передан указатель на тип book, а в другом - само значение.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.03.2014, 16:19   #9
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию

Код:
void librarian::change_catalog(book* this_book, char* new_catalog){
	strcpy(this_book->catalog, new_catalog) ;
	//book::catalog=new_catalog;
}
Почему мы не можем написать, то что в комментариях ??
Дружественная функция librarian::change_catalog для класа book ведь должна иметь доступ к элементам класса book!
zla9_kolu4ka вне форума Ответить с цитированием
Старый 02.03.2014, 16:36   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

1) Функция и имеет доступ к элементам класса, так как catalog приватная переменная
2) А как librarian должен узнать, у какой именно книги сменить каталог?
3) В си строки нельзя просто приравнивать (так как переменная char *s по сути указатель), поэтому нужно именно копировать данные из одной переменной в другую
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
static и non-static context kos1nus Общие вопросы по Java, Java SE, Kotlin 1 17.07.2013 00:10
static массив C++ ViktorKozlov Visual C++ 3 24.05.2013 12:21
static Gen_r_questions PHP 7 05.04.2011 15:12
Использование static Syltan Общие вопросы по Java, Java SE, Kotlin 3 07.06.2010 20:59
По-поводу Static volnixx PHP 3 11.03.2009 12:04