Member 12702056 Ответов: 2

Может ли кто-нибудь понять, что такое 1, 2, 3? А что такое {строка l(5);} в этой программе? Пожалуйста, помогите мне :)


Если кто-то знает, дайте мне знать, пожалуйста :) Заранее спасибо :)
Может ли кто-нибудь понять, что такое 1, 2, 3? А что такое {строка l(5);} в этой программе? Еще один вопрос: *p= * obj. p что это значит? а * означает разыменование?


#include<iostream>
using namespace std;
class Line{
public:
	int getLength(void);
	Line(int len);//constructor
	Line(const Line&obj);//copy constructor
	~Line();//destructor
private:
	int *p;
};

Line::Line(int len)
{
	cout<<"Simple constructor"<<endl;
	p=new int;
	*p=len;
}
Line::Line(const Line&obj)
{
	cout<<"Copy constructor"<<endl;
	p=new int;
	*p=*obj.p;//object is type of line
}
Line::~Line()
{
	cout<<"Destructor"<<endl;
	delete p;
}
Line::getLength(void)
{
	return *p;//dereference p(int p,not adress p)
}
void show(Line obj)
{
	cout<<"2"<<endl;
	cout<<obj.getLength()<<endl;
}


int main()
{
	{Line l(5);}
	Line line(10);

	cout<<"1"<<endl;
	//cout<<line.getLength()<<endl;
	show(line);
	cout<<"3"<<endl;
	return 0;
}


Что я уже пробовал:

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

Maciej Los

Это что, шутка?

Member 12702056

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

Member 12702056

если вы имеете в виду uni.lesson,то это было по ошибке,я написал его здесь неправильно .это было мое сообщение моему другу.я видел его,я редактирую его.это была ошибка.

Philippe Mori

Очевидно, что вы должны читать книги и учиться использовать отладчик.

Philippe Mori

Очевидно, что 1, 2, 3 существуют для того, чтобы вы могли видеть на выходе, в каком порядке выполняются инструкции.

Philippe Mori

Кстати, этот пример кода сломан, потому что он не переопределяет оператор присваивания. Если вы возьмете это из книги, то, возможно, эта книга хороша для мусора...

Member 12702056

Но код работает на моем компьютере.
Я собираюсь учиться, но я только новичок в c++ ,поэтому сначала я стараюсь изучать только концепции и некоторые простые программы, которые я должен уметь писать, а затем я буду учиться отладке :)

Member 12702056

Филипп Мори, я искал информацию об отладке, но какой из них лучше подходит для отладки-начиная с visual studio или dev c++?

2 Ответов

Рейтинг:
4

BillW33

Этот раздел кода:

{Line l(5);}

Эта строка определяет переменную l типа Line и вызывает ее конструктор. Фигурные скобки, иногда называемые волнистыми скобками, используются для создания отдельного блока кода. Блок кода определяет область действия переменных, объявленных в нем. Если вы не вызываете деструктор класса вручную, то его деструктор вызывается автоматически, когда он выходит за пределы области видимости. Включение волнистых скобок вокруг этой строки приводит к тому, что ее деструктор вызывается при достижении"}".

Код вызывает следующий метод в классе line:
Line::Line(int len)
{
	cout<<"Simple constructor"<<endl;
	p=new int;
	*p=len;
}

Этот метод укажет p на новое хранилище int, а затем назначит 5 содержимому p.

Выходные данные 1,2,3 В окне консоли взяты из операторов cout и предназначены только для того, чтобы показать, где находится программа в процессе ее выполнения. Было бы более информативно выводить описательный текст вместо простого числа.

Некоторые из наиболее запутанных вещей для людей, впервые знакомых с C++, - это операторы & и*. Конструктор копирования предназначен для создания копии объекта класса Line в другой экземпляр объекта Line. Параметры конструктора копирования строк "(const Line &obj) " говорят о том, что метод принимает адрес экземпляра класса Line. Экземпляр класса также известен как объект, поэтому параметр называется "obj", что является сокращением от object.
p инициализируется для хранения целого числа следующей строкой:
p=new int;

Давайте проанализируем следующую строку
*p=*obj.p;

"*obj " означает содержимое obj. obj содержит адрес, указывающий на линейный объект; содержимое этого адреса является линейным объектом.
".*параметр obj П" означает, что член "п" объекта до "." поэтому ".П" означает, что член п объекта, адрес которого был передан в метод.
То, что значение P присваивается содержимое в местное отделение полиции через "*Р=".


Member 12702056

Большое спасибо:) а как насчет этого вопроса?
*p= * obj. p что это значит? а * означает разыменование?если вы знаете ответ,Пожалуйста, дайте мне знать тоже :)

BillW33

Я обновил свое решение дополнительным объяснением.

Member 12702056

Еще раз спасибо ,это было ясное объяснение :)

Member 12702056

но я хочу спросить тебя еще об одном.Если я не использую их {}, результат будет другим."
с {}
результат таков:
Простой конструктор
Деструктор
Простой конструктор
1
Конструктор копирования
2
10
Деструктор
3
Деструктор


без {}
результат такой:
Простой конструктор
Простой конструктор
1
Конструктор копирования
2
10
Деструктор
3
Деструктор
Деструктор

Philippe Mori

Путем добавления дополнительных { } это изменение объема переменной l и таким образом вызвать его деструктор раньше. Очевидно, что это должно быть очень легко вывести из вывода... или с помощью отладчика.

BillW33

Я обновил свое решение, чтобы описать эффект {}

Member 12702056

а также, пожалуйста, посмотрите на это,почему у нас нет 5 в результате?это потому, что мы сначала назначаем 5,а затем копируем его и назначаем 10,так что это 10 в конце end.am я прав?

Philippe Mori

Если { } удалены, то деструктор l не вызывается одновременно. Поэтому неправильно говорить, что удаление их как бы не дает никакого эффекта.

Рейтинг:
19

Patrice T

Наблюдение за выполнением программы может помочь понять, что она делает.

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.

Совет: выберите, на каком языке работает эта программа, не нужно перечислять все возможные и невозможные языки. Программа не компилируется на языке C.


Member 12702056

Большое спасибо за ваш ответ:), эта программа написана на c++. хорошо, я ее знаю.я сделаю .ты имеешь в виду тэга?! Я не знал этого, но я изменил его.