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

Вопросы по С++ и не только (~40 вопросов) - C++

Восстановить пароль Регистрация
 
csrnsdrfg1
4 / 4 / 0
Регистрация: 30.03.2012
Сообщений: 34
06.08.2012, 00:44     Вопросы по С++ и не только (~40 вопросов) #1
Накопилось пару вопросов по языку. Буду благодарен за качественный ответ хотя бы на 1 вопрос. При ответе, указывайте пжлст номер.


1) char arr [] = "qwerty" эквиваленто char arr [] = {'q', 'w', 'e', 'r', 't', 'y', '\0'};
Как компилируется вариант1 и вариант2? Всмысле, когда компилятор натыкается на каждый из вариантов, он каждый из них сразу транслирует, или сначала, например, переводит вариант1 в эквивалентный вариант2 (или наоборот) а потом транслирует?
Просто, как я думал, язык С (CPP) немногословен. Ну т.е., например, чтобы объявить массив, надо следовать четкой инструкции, или, даже если инструкций несколько, то каждая из них в чем-то хоть различна (массив можно объявить статическим или динамическим образом - 2 разные инструкции и результаты разные). А тут получается, два разных способа, которые полностью индиентичны (или нет?).

2) в чем разница:
char arr [80] = "d";
и
char arr [80] = {"d"}; //или просто стандарт разрешает опускать скобки при инициализации одномерных чаровских массивов?

Неужели компилятор во втором случае просто игнорирует скобки? Хоть что-то они должны значить!

3) struct {
signed : 1;
} str;
В "Язык C++" (Прата) (да и в некоторых других серьезных источниках) написано, что битовое поле с длиной 1 не может быть знаковым (знаковыми могут быть только от 2ух). Но компилятор не выдает ошибку. Почему?

4) while (getchar () != -1);
буферизированный ввод. после комбинации СИМВОЛ + [CTRL + Z] цикл все равно продолжается. почему? (символ - любой не спецсимвол на клавиатуре).

5) enum en {a, b, c} x;

cout << (x = (en) 1551); //Что тогда предсталяют из себя перечисления, если результат
м.б. не определенным? Какова структура (не всмысле struct, а устройство) перечислений?

6) в учебнике сказано, что для перечислений с небольшим диапозоном может отводится <1байта.

Даже в этой конструкции:
enum {a} x;
cout << sizeof x;
Значение = 4б (и вообще, у меня получалось только либо sizeof int, либо sizeof long long - никаких промежуточных значений)

7) Почему int *a = new int;
delete [] a;
по стандарту не определено ?

8) операция new заносит куда-то адреса, которые были выделены (в противном случае, delete
не знал бы, что удалять. Например, при выделении памяти под массив из 20ти ячеек, delete
(при правильном использовании) точно знает размер массива). Где эта информация хранится и
как ее можно оттуда достать?

9) Как работает операция sizeof? Как она отличает массив из n -cимволов и просто указатель?

10) int b [1];

cout << b << endl << &b; // и b и &b - одинаковые адреса

Если единичный массив (его имя) - указатель, который ссылается сам на себя, где же он тогда хранит значение int?? Иначе: в указателе b лежит значение его адреса, т.е. логично, что при осуществлении операции *b мы попадем на все тот же b, но на практике это не так!!!! Притом - присем, если сделать так:
int* a = (int*) &a; // по идее, то же самое, что и int b [1]
cout << a << endl << &a << endl;
*a = 5;
cout << a << endl << &a;

то здесь, все выходит как и предполагается: если указатель ссылается сам на себя, то при осуществлении доступа по адресу и изменении значения, изменятся значение указателя.

Чем же тогда отличается int* a = (int*) &a от int b [1]?? //ну кроме того, что имя массива - константный указатель, в отличии от первого.

10) Почему будет не определенный результат, если память выделенную в куче
(напр. с помощью new) освободить дважды (delete'ом)?
11) Условия циклов приводятся к булевскому значению или целому? т.е.,
a) while (5 < 8) // след действие --> while (true) ....
или
б) while (5 < 8) // след действие --> while (1) ....
Конечно, по сути, это одно и тоже. true трактуется как 1 (в общем случае
как что угодно, кроме ноля), а false как 0, но тем не менее, хотелось бы точно знать,
к какому типу данных приводится (в конечном итоге) выражение в скобках.

12) Почему возможны операции:
++*x и (*x)++ // x - указатель на int
я рассуждал так:в обоих этих случаях сначала устанавливатся доступ по адресу, которое
возвращает (а м.б. тут ничего не возвращается?!) значение, лежащее по адресу. Операция
инкрементирования (в обоих случаях побочный эффект в конце) равнозначна следующему:
Y++ (или ++Y) тоже, что и Y = Y + 1; (постфиксное и префиксное в контексте, указанном ниже,
не меняет сути - побочный эффект в конце выражения). Иными словами, если *x = 5, то:
++*x == ++5 == 5 = 5 + 1 // попытка присваивания rvalue значения.
Помогите разобраться.

13) Как работает такая схема:
while (int u = 1) ;
и почему тогда не работает такая:
cout << (int u = 1);

14) int main ()
{
int main () ;
int main () ; //......
}

Как это вообще работает? по сути, я написал прототипы мейн в самом определении мейн. Как это ерунда вообще компилируется?!

15)
ининциализация - не просто последовательное выполнение двух операций (объявление и
присваивание)?
Такой код не работает:
(int a) = 5; //почему?

16)
const int a = 5;
int* b = (int*) &a;
*b = 4; //Компил здесь ошибки не выдал
cout << &a << " :: " << b << endl;

cout << a << " :: " << *b;

КАК по одному адресу может находится 2 разных числа?!

17)
template <typename name> void func__ (name const & a)
{
*a = 8;
}


int main ()
{
int a = 2;
func__ (&a); //Т.к. передается не сама переменная, а ее адрес (т.е. rvalue), то в памяти выделяется
безымянная переменная (для того, чтобы шаблон ф-ии мог брать ссылку на фактический аргумент - т.е. &a).
Но в таком случае, компилятор требует спецификатора const для того, чтобы я не мог изменять значения
формального параметра, т.к. эти изменения приведут лишь к изменению той самой безымянной переменной.
Если не написать const, компилятор пишет соответствующую ошибку. Но дело в том, что я написал в шаблоне
(name const & a) а не (const name & a) и все-равно все заработало. Почему?

std :: cout << a;
}

18) Я объявил регистровую переменную. Если где-то в программе я пытаюсь взять ее адрес, то:
а) При компиляции компилятор систематически не сделает ее регистровой, даже если на то позволяет сис-ма
б) Сделает какую-то махинацию (я где-то слышал, что он может создавать копию регистровой переменной в оп. памяти)? Если да, то собственно какую.

19) Когда-то инициализация static переменной другой переменной запрещена, так же в качестве аргумента case (в switch) не могла выступать переменная. Почему это когда-то было запрещено (причина), а теперь разрешено?

20)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "myglobal.txt"
 
int static a = 65;
 
int main ()
{
 
cout << a;
 
}
 
//File "myglobal.txt"
 
int static a = 5;
//----------------------
Ошибка: redefinition of 'int a'|

Область видимости переменной (а), объявленной в myglobal.txt распространяется только на этот файл.
Компилятор говорит об обратном. Разве внешние статическиене распространяются только на тот файл, где они
объявлены?

21) как адресный new (с аргументом) узнает о размере буффера? Напр:

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
char* sys_buffer = new char [5000];
.....
int* p1 = new (sys_buffer) int; //Откуда new знает о размере массива?
 
22) void exp (int status = 1);
 
namespace nmsp
{
    void func ()
    {
    cout << "Hello, i am func () declared in namespace (nmsp) \n";
    }
}
 
void func ()
{
cout << "Hello, i am a simple func () \n";
}
 
int main ()
{
exp ();
exp (0);
}
 
void exp (int status)
{
if (status)
    {
    using nmsp::func;     //Здесь nmsp-ешная перекрывает обыную.
    func ();
    }
else
    {
    using namespace nmsp;
    func ();               //Компил не знает, какую из ф-ий выбрать (ambiguous).
    }
}
Почему возникает различие (какого устройство using) при подключении пространства имен или конкретного
объекта (в данном случае).

23) Почему нельзя объявлять пр-во имен (в т.ч. и неименованное) а так же ф-ии внутри блока (напр. в теле ф-ии)?

24)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void func (int a, char b, short c, double d, void* f)
{
//cout << &n << endl << (void*) &a << endl << (void*) &b << endl << (void*) &c;
 
printf (" int :: %d \n char :: %d \n short :: %d \n double :: %d \n void* :: %d \n", &a, &b, &c, &d, &f);
}
 
int main ()
{
char arr [10] = {'A', 'B', 'C'};
 
func (5000, 'a', (short) 5, .001, (void*) 0);
}
Почему формальные аргументы func () располагаются в памяти не последовательно? Ведь значения, передаваемые ей,
пихаются в стек.

25) Зачем при присваивании одного объекта класса другому и при инициализации объекта класса с помощью
операции " = " некоторые компляторы создают временный объект?

26)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Cls
{
string h;
 
public:
Cls (string);
 
};
 
int main ()
{
const Cls x ("asddas");               //Успешная инициализация
const Cls z = Cls ("asddas");         //Успешная инициализация  
 
const Cls y = (string) "asd";         //Работает только с привидением типа (т.е. вот этим - (string)). В противном случае:
//conversion from 'const char [4]' to non-scalar type 'const Cls' requested
//Почему эта ошибка высветилась и почему тогда первый и второй случай инициализации работают без привидения типа?
}
 
Cls :: Cls (string)
{
/*Empty constructor*/
}
27)
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
class Cls2
{
int _i;
 
public:
 
int i, g;
 
Cls2 (int c__i, int c_i)
{
_i = c__i, i = c_i;
}
 
private:
 
int _g;
};
 
int main ()
{
Cls2 x (100200, 1);
 
cout << *(&x.i - 1);
}
Почему тогда говорится, что классы обеспечивают защиту данных?

28) Как создать массив битовых полей?

union
{
long long a;

unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;

.....copypast?
} un;

29)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
int func ()
{
int x;
 
return x;
}
 
 
int main ()
{
func () = 7; //Ошибка. Оно и понятно, попытка присваивания lvalue значения.
}
 
//а здесь уже интересней:
 
struct str
{
int a;
} a = {1}, b = {2};
 
str func ()
{
str a;
 
return a;
}
 
int main ()
{
func ().a = 7; //no error (если бы ф-ия возвращала const str тогда error была бы, а так нет)
}
 
//Более того:
 
class Cls
{
int a;
 
public:
 
Cls (int c_a = 0)
{
a = c_a;
}
 
Cls operator+ (Cls& aa)
{
Cls bb;
 
cout << "\n operands : " << a << " and " << aa.a;
 
this -> a = 7; //Во второй раз меняется уже lvalue
 
bb.a = aa.a + a;
 
cout << endl << " bb.a = " << bb.a << endl;
 
return bb;
}
 
};
 
int main ()
{
Cls a (1), b (2), c (3);
 
a.operator+ (b).operator+ (c); //теперь уже явный пример изменения lvalue
}
Почему для собственных типов можно изменять lvalue (хотя это даже по определению невозможно)? Или возвра
щается не lvalue? Чего вообще происходит-то? Как это работает?

30) Где находится информация о типе данных константы (напр: 5, -777, "строковый литерал")
и просто переменной?

31) Почему операции "=" "[]" "()" "->" перегружаются только для ф-ий - членов (например, в своей программе я могу не использовать операцию "[]" и хочу ее переопределить)?

32) Почему недопустима запись:

class.....
{
.....

class_type& friend operator<< (..... /*Хотя допустима без ссылки или если friend стоит левее возвращаемого значения operator*/

};

33)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Cls
{
int a;
 
public:
 
friend ostream&  operator<< (ostream&, Cls& A);
};
 
ostream& operator<< (ostream& out, Cls& A)
{
out <<  "operator<< (ostream& out, Cls& A) :: A.a is :: " << A.a << endl;
return out;
}
Почему этод код работает только тогда, когда operator<< принимает ссылку на ostream и возвращает ссылку
на него (а не просто принимает по значению и возвращает значение).


34) Мне надо, чтобы конструктор класса определял значения по умолчанию одной из ф-ий - методов. Как это
реализовать? Напр:

class Cls
{
public:

Cls () ..... //constructor

void func (int x = @) //@ - параметр по умолчанию, который во время компиляции не определен.
}

35) Почему sizeof класса, в котором нет переменных == 1?
Почему sizeof класса, в котором только 1 переменная == sizeof переменной (т.е. даже без того 1 байта, что вверху), а при нескольких переменных
sizeof всегда кратен 4 (хотя у меня 64бит сис-ма)?

36) Почему (в классах) explicit недоступно для метода operator name_of_type () ?


37) Почему стандарт определяет неявное приведение типа для класса, имеющего конструктор с одним аргументом
(например: Cls a; a = 5, но не определяет для остальных конструкторов (например, стиль в данном случае
мог бы быть таким же, как и для структур. Например : struct str {...}; str a = {... , ... , .....})?

38) Почему ф-ия метод operator type_to_from_class_type () может (по идее и должна) иметь return, но тип возвращаемого значения для нее нету. как компилятор узнает, сколько места надо выделить ей для возвращаемого значения?

39) int func (short a [5])
{
}

Что обозначает сигнатура этой ф-ии?

//-------------------------------------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2012, 00:44     Вопросы по С++ и не только (~40 вопросов)
Посмотрите здесь:

C++ Пачка вопросов по C++
Несколько вопросов C++
Много вопросов C++
C++ Несколько вопросов
Куча вопросов.. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.08.2012, 02:23     Вопросы по С++ и не только (~40 вопросов) #2

Не по теме:

Ничего себе погрешность вычислений. Пара... Есть же слово «несколько»

Классная подборка «подъе задай хитровыебый вопрос соискателю на собеседовании».

Сколько месяцев собирали?



5. Перечисления — поименованные константы целочисленного типа (int, long или что там — выбирает комплиятор так, чтобы все значения влезли). Соответственно, целочисленные значения и другие перечисления можно приводить к другим перечислениям (но отсторожно; если значения не сойдутся — undefined behavior). Значения константам можно задавать руками, если не задавать — нумеруются последовательно от нуля (или ближайшего заданного).

6. Угу, может. А может и нет. Компилятор обязан обеспечить, чтобы все значения влезли. Если их всего 40 штук и они меньше 40 по значению, то он волен выбрать как char, так и int.

7. Потому что delete[] для созданного new[], а delete — для new.

8. Это надо спрашивать у разработчиков компиляторов, разработчиков оператора new для этого класса и разработчиков ОС. Логичней всего: или где-то в специальной таблице, или сразу же перед выделенным куском памяти.

9. Она отрабатывет во время компиляции и, соответственно, спрашивает у парсера, что это — массив или указатель.

10. Имя массива при приведении к типу указателя становится указателем на первый элемент массива. a и &(b[0]) — одно и то же.

10 (дубликат). Потому что эта память уже вам не принадлежит после delete. Считайте, вон та информация из восьмого вопроса стёрта; и вообще этот кусок памяти перед вторым delete уже мог быть кому-то отдан.

11. К булевому.

12. *x возвращает lvalue, а значит его можно спокойно инкрементировать.

13. Потому что while (тип имя = значение) — особый синтаксис для while, эквивалентный
C++
1
2
3
4
5
6
{
  тип имя = значение;
  while (имя) {
    // ...
  }
}
operator<< у ostream ждёт, что вы ему значение дадите.

15. Инициализация — форма объявления переменной. Соответственно, у неё свой синтаксис. Это не две отдельные операции.

16. Это отработала оптимизация. Вместо всех обращений к a компилятор влепил сразу 5.

17. (Не уверен.) Возможно, это компилятор так следует стандарту. Они должны быть одинаковы: ссылкой на константый name.

18. Декларация register — это просьба компилятору «пожалуйста, постарайся запихнуть это в регистр, а если не выйдет, то сделай auto (как обычно)». Если вы берёте адрес, то компилятор и пытаться не будет положить её в регистр.

19. (Не уверен.) Потому что компиляторы поумнели и теперь могут генерировать код, высчитывающий переход на лету, а не во время компиляции.

20. Глобальные static-переменные не экспортируются из файла, да. К ним можно обращаться только внутри этого файла.

21. Ниоткуда. Не хватает — получай сегфолт. Placement new ожидает, что места выделено достаточно, чтобы конструктор отработал нормально.

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

26. Потому что объявление "тип имя = значение", где тип значения не совпадает с типом объявляемой переменной подразумевает, что у объявляемого типа должен быть конструктор, который может принимать этот тип значения. Додумывать промежуточные преобразования компилятор не решается.

27. Потому что от прямого доступа к памяти через указатель не спасает ничто.

29. Возвращаемое значение функции — это rvalue, да. Но если это объект, то методам этого объекта разрешается изменять rvalue-величину (если она не const).

30. В желудке парсера. Тип выводится по определённым правилам и запоминается парсером.

31. (Немного не понял.) Встроенные операции не перегружаются принципиально. Все, относящиеся к собственным типам данных — пожалуйста.

33. Потому что копия потока — это не тот же самый поток.

34. Никак. Параметры по умолчанию подставляются при компиляции.

36. (Не уверен.) Потому что для явного приведения типов и так есть запись.

38. Потому что компилятор и так видит тип после слова operator.



Что-то я спать уже хочу...
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.08.2012, 02:33     Вопросы по С++ и не только (~40 вопросов) #3

Не по теме:

csrnsdrfg1, за месяц спустя предыдущей вашей темы с этими же вопросами могли бы и сам ответы накопать!


15.
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
(int a) = 5; //почему?
а почему он должен работать? логику пожалуйста

Добавлено через 1 минуту
1.
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
А тут получается, два разных способа, которые полностью индиентичны (или нет?).
идентичны

Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
Как компилируется вариант1 и вариант2? Всмысле, когда компилятор натыкается на каждый из вариантов, он каждый из них сразу транслирует, или сначала, например, переводит вариант1 в эквивалентный вариант2 (или наоборот) а потом транслирует?
это к разработчикам компилятора, преобразовывать эти варианты между собой глупо

2
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
2) в чем разница:
char arr [80] = "d";
и
char arr [80] = {"d"}; //или просто стандарт разрешает опускать скобки при инициализации одномерных чаровских массивов?
Неужели компилятор во втором случае просто игнорирует скобки? Хоть что-то они должны значить!
ничего скобки в этом коде не значат!

3.
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
3) struct {
signed : 1;
} str;
В "Язык C++" (Прата) (да и в некоторых других серьезных источниках) написано, что битовое поле с длиной 1 не может быть знаковым (знаковыми могут быть только от 2ух). Но компилятор не выдает ошибку. Почему?
приведи цитату

4.
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
4) while (getchar () != -1);
буферизированный ввод. после комбинации СИМВОЛ + [CTRL + Z] цикл все равно продолжается. почему? (символ - любой не спецсимвол на клавиатуре).
это к разработчикам виндус, почему их система требует подтверждения(Enter) для CTRL + Z

6.
6) в учебнике сказано, что для перечислений с небольшим диапозоном может отводится <1байта.

Даже в этой конструкции:
enum {a} x;
cout << sizeof x;
Значение = 4б (и вообще, у меня получалось только либо sizeof int, либо sizeof long long - никаких промежуточных значений)
выравнивание данных

7.
7) Почему int *a = new int;
delete [] a;
по стандарту не определено ?
потому что new & new [] это разные операторы

10.
10) int b [1];

cout << b << endl << &b; // и b и &b - одинаковые адреса

Если единичный массив (его имя) - указатель, который ссылается сам на себя, где же он тогда хранит значение int??
да одинаковые адреса, только это фишка компилятора считать b и &b одним и тем же, т.е. на этапе трансляции эти операции могут заменятся одна другой

10
10) Почему будет не определенный результат, если память выделенную в куче
(напр. с помощью new) освободить дважды (delete'ом)?
потому что при удалении, метаданные(см. свой вопрос №8) удаляются, а остальная память занимаемая твоими данными помечается как свободная, при вызове delete 2-й раз он обратится к уже невалидным метаданным

11, 12, 13, 14
Standart of С++, appendix A - Grammar summury, изучай

16.
оптимизации компилятора

17.
это (name const & a) и это (const name & a) одно и то же!

25
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
25) Зачем при присваивании одного объекта класса другому и при инициализации объекта класса с помощью
операции " = " некоторые компляторы создают временный объект?
затем что по умолчанию конструктор копии и оператор присваивания имеют лишь один параметр - ссылку на объект тип которого совпадает с типом создаваемого/реинициализированного объекта

27.
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
Почему тогда говорится, что классы обеспечивают защиту данных?
потому что вся защита работает в compile-time, в run-time никакой защиты нет!

28
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
28) Как создать массив битовых полей?
а зачем? unsigned int field; - вот тебе и массив из битовых полей

30
30) Где находится информация о типе данных константы (напр: 5, -777, "строковый литерал")
и просто переменной?
в таблицах компилятора

33
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
Почему этод код работает только тогда, когда operator<< принимает ссылку на ostream и возвращает ссылку
на него (а не просто принимает по значению и возвращает значение).
а вы где-то видели конструктор копии для basic_ostream<...> ?

35
35) Почему sizeof класса, в котором нет переменных == 1?
Почему sizeof класса, в котором только 1 переменная == sizeof переменной (т.е. даже без того 1 байта, что вверху), а при нескольких переменных
sizeof всегда кратен 4 (хотя у меня 64бит сис-ма)?
а проект(или флаги компиляции) на 146% 32-х битный?!

36
Цитата Сообщение от csrnsdrfg1 Посмотреть сообщение
36) Почему (в классах) explicit недоступно для метода operator name_of_type () ?
ЕМНИП в новом стандарте такая запись доступна
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.08.2012, 09:52     Вопросы по С++ и не только (~40 вопросов) #4
35.

Complete objects and member subobjects of class type shall have nonzero size.107 [ Note: Class objects can
be assigned, passed as arguments to functions, and returned by functions (except objects of classes for which
copying or moving has been restricted; see 12.8). Other plausible operators, such as equality comparison,
can be defined by the user; see 13.5. — end note ]
37.

C++11. http://liveworkspace.org/code/b9d4b2...f728406923f9bf

38.

A member function of a class X having no parameters with a name of the form
conversion-function-id:
operator conversion-type-id
conversion-type-id:
type-specifier-seq conversion-declaratoropt
conversion-declarator:
ptr-operator conversion-declaratoropt
specifies a conversion from X to the type specified by the conversion-type-id. Such functions are called
conversion functions. No return type can be specified. If a conversion function is a member function, the
type of the conversion function (8.3.5) is “function taking no parameter returning conversion-type-id”. A
conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified)
same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to
it), or to (possibly cv-qualified) void.116
[ Example:
C++
1
2
3
4
5
6
7
8
struct X {
operator int();
};
void f(X a) {
int i = int(a);
i = (int)a;
i = a;
}
In all three cases the value assigned will be converted by X::operator int(). — end example ]
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 17:17     Вопросы по С++ и не только (~40 вопросов) #5
10) Массив это по сути и есть указатель

Предположим, что b состоит из 10 элементов, то:

b - адрес
(b + 1) - адрес
(b + 2) - адрес
Yandex
Объявления
12.08.2014, 17:17     Вопросы по С++ и не только (~40 вопросов)
Ответ Создать тему
Опции темы

Текущее время: 12:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru