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

константная ссылка в качестве аргумента конструктору копирования - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти причины возникновения и исправить ошибку 'man' was not declared in this scope http://www.cyberforum.ru/cpp-beginners/thread1792960.html
#include <iostream> #include <Windows.h> #include <ctime> using namespace std; class Passport { private: int ID;
C++ Порядок вычисления: операторы «|» и «||», «&» и «&&» В Java булевые операторы «|» и «||», и «&» и «&&» отличаются друг от друга порядком вычеслений, а в C++ так же как и в Java или по-другому? http://www.cyberforum.ru/cpp-beginners/thread1792958.html
C++ Нюансы синтаксиса: использование using
Всем доброе утро, вообщем хотел спросить давно уже, а что делает using, помимо вот такого его применения using std::cout; //... вот HelicopterK52, преводил в соседней теме struct Base {
C++ Наследуются ли конструкторы?
Привет. Хочу спросить, если базовый класс имеет открытый конструктор по умолчанию, то при открытом наследовании будет ли создан конструктор по умолчанию в прямом производном классе, если он не определен явно(стоит сказать, что явно определены другие конструкторы, но не конструктор по умолчанию)?
C++ Когда необходимы определения членов-перемещения http://www.cyberforum.ru/cpp-beginners/thread1792905.html
Дарова всем. Не так давно прочел про конструкторы перемещения и соотв. операторы присваивания с перемещением. И возник такой вопрос: эти методы нужно определять только когда класс работает с динамической памятью? А для таких классов смысла определения операций перемещения нет? class { int x, y;
C++ Удалить из матрицы нулевые строки и столбцы и найти строку, содержащую хотя бы один положительный элемент Дали три задачи на зачетную. С массивами у меня более менее нормально, но вот сами задания, что от меня требуется - понять не могу. Может кто решал что-то подобное или понимает, что здесь нужно сделать? В общем прошу помочь с этими задачами. Спасибо. P.S. Оформлять нужно не в консольном, а в Форме. Уплотнить заданную матрицу, удаляя из нее строки и столбцы, заполнен-ные нулями. Найти номер... подробнее

Показать сообщение отдельно
DENIS94
 Аватар для DENIS94
22 / 22 / 0
Регистрация: 12.04.2013
Сообщений: 122
12.08.2016, 15:55     константная ссылка в качестве аргумента конструктору копирования
Можно сделать например так:

main.cpp
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
#include <iostream>
 
#include "mstring.h"
 
mtype::string func()
{
    return mtype::string("rvalue");
}
 
int main(int , char *[])
{
    using namespace mtype;
 
    string s = "qweqweqwe";
    string z = "asdasdasd";
    s = z;
    z = "hello world!";
    z = string("12345");
    string w;
    w = std::move(func());
 
    std::cout << s << std::endl;
    std::cout << z << std::endl;
    std::cout << w << std::endl;
 
    std::cout << w[2] << std::endl;
 
    return 0;
}
mstring.h
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#ifndef MSTRING_H
#define MSTRING_H
 
#include <memory>
#include <utility>
#include <cstring>
#include <iostream>
 
namespace mtype
{
 
class string
{
private:
    typedef unsigned char tdata;
    struct data
    {
        tdata     * m_str;
        std::size_t m_size;
        data(tdata * str = nullptr, std::size_t size = 0) :
            m_str(str),
            m_size(size)
        {}
    };
 
public:
    inline ~string();
 
    inline string();
    inline string(const char * str);
    inline string(const string & str);
    inline string & operator=(const char * str);
    inline string & operator=(const string & str);
 
    inline string(string && str);
    inline string & operator=(string && str);
 
    inline tdata & operator[](std::size_t i);
 
    friend std::ostream & operator<<(std::ostream & stream, const string & s);
 
private:
    void copyData(const tdata * str, std::size_t sz);
 
private:
    data * m_d;
};
 
inline string::~string()
{
    if (m_d)
    {
        if (m_d->m_str) delete[] m_d->m_str;
        delete m_d;
    }
}
 
inline string::string() :
    m_d(new data{})
{}
 
inline string::string(const char * str) :
    m_d(new data(nullptr, std::strlen(str)))
{
    m_d->m_str = new tdata[m_d->m_size + 1];
    m_d->m_str[m_d->m_size] = 0;
    std::memcpy(m_d->m_str, str, m_d->m_size);
}
 
inline string::string(const string & str) :
    m_d(new data(nullptr, str.m_d->m_size))
{
    m_d->m_str = new tdata[m_d->m_size + 1];
    m_d->m_str[m_d->m_size] = 0;
    std::memcpy(m_d->m_str, str.m_d->m_str, m_d->m_size);
}
 
inline string & string::operator=(const char * str)
{
    copyData(reinterpret_cast<const tdata*>(str), std::strlen(str));
    return (*this);
}
 
inline string & string::operator=(const string & str)
{
    copyData(str.m_d->m_str, str.m_d->m_size);
    return (*this);
}
 
inline string::string(string && str) :
    m_d(str.m_d)
{
    str.m_d = nullptr;
}
 
inline string & string::operator=(string && str)
{
    std::swap(m_d, str.m_d);
    return (*this);
}
 
inline string::tdata & string::operator[](size_t i)
{
    return m_d->m_str[i];
}
 
inline std::ostream & operator<<(std::ostream & stream, const mtype::string & s)
{
    stream << s.m_d->m_str;
    return stream;
}
 
}
 
#endif // MSTRING_H
mstring.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "mstring.h"
 
namespace mtype
{
 
void string::copyData(const tdata * str, size_t sz)
{
    if (!m_d->m_str) m_d->m_str = new tdata[sz + 1];
    else
    {
        if (m_d->m_size != sz)
        {
            delete m_d->m_str;
            m_d->m_str = new tdata[sz + 1];
        }
    }
    m_d->m_size = sz;
    m_d->m_str[m_d->m_size] = 0;
    std::memcpy(m_d->m_str, str, m_d->m_size);
}
 
}
 
Текущее время: 22:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru