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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
FanAizu
0 / 0 / 0
Регистрация: 14.01.2011
Сообщений: 31
#1

Конструктор копирования, типы данных. - C++

14.01.2011, 18:45. Просмотров 1582. Ответов 8
Метки нет (Все метки)

1) Как я понял из прочтения есть конструктор по-умолчанию, который создается по-умолчанию компилятором, но можно и самому явно указать конструктор не принимающий параметров это и будет конструктор по-умолчанию, но в нем теперь можно проинициализировать элементы класса. Если указать ещё один конструктор, но который принимает параметры, то это будет уже не конструктор по-умолчанию и вступать в работу он будет, когда создается объект и передаются параметры. Существует также конструктор копирования. В его объявление должен присутствовать указатель на объект такого же класса откуда конструктор. Получив указатель конструктор поэлементно копирует значения элементов одного объекта в элементы другого объекта. Данный конструктор используется, когда создается объект и сразу же производится его инициализация, то есть что-то вроде этого:
C++
1
2
3
4
5
6
class time
{
.....
};
time object1;
time object2 = object1; // вот здесь вступит в работу конструктор копирования, да?
Есть другой способ копирования значений одного объекта в значения другого объекта - это перегрузка оператора присвоение. Она вступает в работу, когда используется простое присвоение одного объекта другому, но при этом оба объекта уже созданы, да?


2) не могу понять, что такое объявление и определение? расскажите, пожалуйста, своими словами.

3) Хотел бы спросить ещё про типы данных. На сколько я понял указание типа данных во-первых нужно для того, чтобы знать сколько памяти выделить под данные, во-вторых для того, чтобы знать в какой форме эти данные представить(записать) в ячейку памяти. В-третьих типы данных указывают какие операции можно произвести над операндами, а какие нет(это защита от глупости, например от возведения указателя в квадрат - это не логично). Если операнды имеют разные типы данных и над ними пытаются произвести какую-нибудь операцию, то операнды попробую привести к одному типу(например, если складывают int и long, то в памяти на которую указывает переменна типа int будет прибавлено пару байт, то есть имя переменной будет уже указывать на большее число байт памяти). Если же компилятору операция покажется нелогичной например сложение символьного типа и int, то компилятор выдаст ошибку. Объявление типа данных с этой точки зрения даёт возможность компилятору отслеживать какие операции логичны, а какие нет. Но, даже, если операция не логична, то можно послать компилятор и сказать ему, что да я понимаю, что операция нелогичная, но я осознаю, что делаю - это действие называется явным приведение типов.

Просьба прокомментируйте все моменты, желательно до последней мелочи, хочу понимать всё, как есть. И укажите, где и что не правильно сказано, а где и вовсе глупости. Заранее благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2011, 18:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор копирования, типы данных. (C++):

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include <math.h> #include <algorithm> using...

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? - C++
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы: 1. Можете ли на понятным для...

Конструктор копирования - C++
Привет Подскажите пожалуйста, как правильно сделать конструктор копирования. Заголовки: class String { public: char *Data; ...

8
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
14.01.2011, 19:00 #2
Цитата Сообщение от FanAizu Посмотреть сообщение
2) не могу понять, что такое объявление и определение? расскажите, пожалуйста, своими словами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
 
int f(int);  //объявление
 
int main(){
    int a=f(5);
    cout<<a;
}
 
int f(int a){  //определение
    return a*a;
}
0
FanAizu
0 / 0 / 0
Регистрация: 14.01.2011
Сообщений: 31
14.01.2011, 19:23  [ТС] #3
а словами можно? что-то я логики не прослеживаю.
0
asics
Freelance
Эксперт С++
2850 / 1785 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
14.01.2011, 19:25 #4
FanAizu, Прототип функции это ее обявление, а реализация - определение.
0
papochka
33 / 33 / 2
Регистрация: 14.11.2009
Сообщений: 137
14.01.2011, 19:40 #5
потёрто...
0
FanAizu
0 / 0 / 0
Регистрация: 14.01.2011
Сообщений: 31
14.01.2011, 19:43  [ТС] #6
В общем, когда память выделяется реально, то это определение, например вот определения:
int a;
char b;
Time object; // time это имя класса
реализация функции

А объявления никакой памяти не выделяют, то есть объявление это:
прототипы функций, класс, структура.

всё верно?
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.01.2011, 19:55 #7
наоборот
C++
1
2
3
4
//определение
class myclass {
////
};
C++
1
2
3
//объявление
int a;
myclass mine; //неявная иницилизация - вызов конструктора по умолчанию
C++
1
2
3
//иницилизация
а = 5;
mine = your;
0
FanAizu
0 / 0 / 0
Регистрация: 14.01.2011
Сообщений: 31
14.01.2011, 20:17  [ТС] #8
ну теперь опять непонятно, я так полагал, что например объявление это когда под констркцию реально выделяется память, а определение это когда конструкция что-то описывает, но память под нее не выделяется. в чем разница?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
14.01.2011, 20:30 #9
FanAizu
C++
1
2
3
4
5
6
7
8
9
10
//1.cpp
int getA(); //объявление
//...
int p = getA() * 10;
//...
 
//2.cpp
int getA(){ //определение
  return a;
}
когда компилятор будет компилировать первый файл он будет думать: "так где то есть функция int getA(void), я не знаю что она делает, и даже не знаю где она может быть, но у нее такие параметры и она возвращает тото", объявление требуется для того, чтобы вы могли в коде использовать функции (аналогично с переменными), которые не определены в данной единице компиляции

в примере что делает компилятор:
1. компилирует файлы 1.cpp, 2.cpp - каждый по отдельности, когда он будет компилировать 1.cpp он даже не будет знать где тело функции getA, результатом будет объектные файлы 1.obj, 2.obj
2. потом пойдет линковка - линковщик увидит, что в 1.cpp используется не определенная функция, и начнет искать ее в других объектных файлах, если найдет - подставит адрес, или нечто в этом духе
0
14.01.2011, 20:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2011, 20:30
Привет! Вот еще темы с ответами:

Конструктор копирования - C++
Конструктор копирования в качестве параметра принимает ссылку на экземпляр типа класса. Вопрос заключается, почему именно...

Конструктор копирования - C++
Есть вопрос. Как объект одного класса передать в объект другого класса?

Конструктор копирования - C++
#include &lt;iostream&gt; using namespace std; class test { public: int x; test(int num); test(const...

Конструктор копирования - C++
Выводит мусорное значение в случае сохранения изменений. что не так? void Account::WithdrawMoney() { char c; Account *Jon = new...


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

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

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