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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2014, 11:36   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А это по-моему инициализация так пишется. Я правда не в курсе почему, но примеры подобного у нас были.

А напомни мне чем она от =0 отличается?

Технически отрабатывает explicit constructor.
Однако, применительно к примитивным типам - разницы нет никакой.

Гораздо интереснее, что происходит при инициализации вида:

тип переменная = значение.

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

Если в правой части находится объект типа1, а в левой части - типа2,
то компилятор сначала построит в правой части временный объект типа2, используя explicit constructor.

И только затем начнет строить объект в левой части, используя конструктор копии с этим временным объектом в качестве аргумента.
При этом срабатывает стандартная оптимизация NRVO, и конструктор копии становится не наблюдаемым.

Таким образом:

Код:
Example ex = 10;
Компилятор сначала превращает в:

Код:
Example ex = Example(10);
А затем:

Код:
Example ex(Example(10));
Вы видите: в конечном счете компилятор все сводит к использованию explicit constructor и конструктору копии.
А дальше компилятор видит, что результат выражения идентичен:

Код:
Example ex(10);
И оптимизирует до этого состояния.


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

Пример:

http://rextester.com/XBXCI24733


Код:
#include <iostream>

struct Example
{
    Example(int) { std::cout << "ctor: int\n"; }
    
    
    //если же вы закомментируете приватную секцию
    // код скомпилируется, но запуска конструктора копии вы не увидите
private:
    
    
    Example(const Example&) { std::cout << "copy:\n"; }
};

int main()
{
    
    // error: ‘Example::Example(const Example&)’ is private
    Example e = 10;
    
    std::cout << "Hello, world!\n";
}
Это если компилятор гцц, который ведет себя согласно букве стандарта.
Компилятор вижалстудии cl скомпилирует такой код без проблем, пропустив факт того что конструктор копии приватный.

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

Последний раз редактировалось _Bers; 30.09.2014 в 12:15.
_Bers вне форума Ответить с цитированием
Старый 30.09.2014, 11:51   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Технически отрабатывает explicit constructor.
О! Точно. Вот что я не мог вспомнить. Впрочем мне как-то не попадались случаи где это принципиально.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.09.2014, 11:53   #13
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

От КЭПа:
Код:
Foo a(0); // конструктор Foo(int)
Foo b = 1; // конструктор Foo(int) если не explicit. 
// ну и очевидно, не сканает, если конструктор принимает несколько аргументов
a = b; // ваще не конструктор, а оператор присваивания (т.к. не инициализация, а присваивание)
Foo c = {123}; // тоже самое - вызов конструктора Foo(int) если не explicit
//  сканает и если аргументов несколько {123, "asd"}. 
// Ну и работает это начиная с С++11
rrrFer вне форума Ответить с цитированием
Старый 30.09.2014, 11:59   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
От КЭПа:
Код:
Foo b = 1; // конструктор Foo(int) если не explicit.

кэп ошибся. Подробности читайте выше.

Код:
//not explicit only
Foo b = 1; // Foo b(Foo(1)) ---> nrvo ---> Foo b(1)

Последний раз редактировалось _Bers; 30.09.2014 в 12:05.
_Bers вне форума Ответить с цитированием
Старый 30.09.2014, 12:04   #15
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
кэп ошибся. Подробности читайте выше.
спасибо от кэпа.
rrrFer вне форума Ответить с цитированием
Старый 30.09.2014, 17:15   #16
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

а как записать число в строку (3-я задача)?
Разбивать на разряды и записывать каждое в отдельную ячейку символьного массива с помощью itoa()?
marenko.lilia вне форума Ответить с цитированием
Старый 30.09.2014, 17:17   #17
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Начала решать, но не знаю как дальше
Код:
#include<iostream>
using namespace std;

char* dashInsert(int num);

int main()
{
	setlocale(LC_ALL, "rus");

	dashInsert(5089);	
	
	return 0;
}

char* dashInsert(int num)
{
	char *str = 0;
	int amountOfDigit = 0;

	int tempNum = num;
	while (tempNum >= 1) // находим количество цифр в числе
	{
		tempNum /= 10;
		amountOfDigit++;
	}
		
	cout << amountOfDigit << endl;

	str = new char[amountOfDigit + 1];

    //...
	
	return str;
}

Последний раз редактировалось marenko.lilia; 30.09.2014 в 22:48.
marenko.lilia вне форума Ответить с цитированием
Старый 30.09.2014, 19:45   #18
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2marenko.lilia
Код:
#include <iostream>

using namespace std;

string dashInsert(int val) {
	string str;
	int i = 0;
	bool flag = false;

	while (val) {
		i = val % 10;

		if (flag && i % 2 != 0) {
			str.push_back('-');
		}

		flag = i % 2;
		str.push_back('0' + i);
		val /= 10;
	}

	return string(str.rbegin(), str.rend());
}

int main() {
	cout << dashInsert(13457) << endl;
	cout << dashInsert(99946) << endl;
	cout << dashInsert(56730) << endl;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 02.10.2014 в 15:28.
pproger вне форума Ответить с цитированием
Старый 30.09.2014, 22:55   #19
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

2pproger - спасибо
marenko.lilia вне форума Ответить с цитированием
Старый 01.10.2014, 17:09   #20
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Решение второй задачи: http://coliru.stacked-crooked.com/a/4454ce729305478a

Код:
#include <string>
#include <regex>
#include <iostream>

bool ABCheck( const std::string &str );

int main()
{
    std::cout << "lane borrowed: " << ABCheck( "lane borrowed" ) << std::endl;
    std::cout << "after badly: " << ABCheck( "after badly" ) << std::endl;
    std::cout << "Laura sobs: " << ABCheck( "Laura sobs" ) << std::endl;

    return 0;
}

bool ABCheck( const std::string &str )
{
    std::regex e( "a.\\{3\\}b", std::regex_constants::basic );

    if ( std::regex_search( str, e ) ) {
        return true;
    } else {
        return false;
    }
}
Output:
Цитата:
lane borrowed: 1
after badly: 0
Laura sobs: 1

Последний раз редактировалось 8Observer8; 01.10.2014 в 17:13.
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить 3 задачки GraverYA Общие вопросы C/C++ 24 23.09.2014 15:27
Задачки на Паскале помогите пожалуйста решить 2 задачки, а то отчислят. плиз VADOS2009-1 Помощь студентам 0 03.06.2009 18:11
3 задачки,помогите решить ДашулЬка Паскаль, Turbo Pascal, PascalABC.NET 11 12.04.2009 17:37
Помогите решить 3 задачки... Goldberg Паскаль, Turbo Pascal, PascalABC.NET 8 08.11.2008 16:36