16 / 16 / 1
Регистрация: 13.10.2012
Сообщений: 454
|
|
1
|
Конструктор копирования в Visual Studio 2012
04.04.2013, 15:07. Показов 783. Ответов 0
По идее это должен выполнять конструктор копирования. В мэине String rgb [0] = s1; работает,
а String rgb [0] = String (s1); уже нет.
хэдэр
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
| #ifndef STRING1_H_
#define STRING1_H_
#include <iostream>
class String {
private:
char * str;
int len;
static int num_strings;
//ввод границы cin
static const int CINLIM = 80;
public:
//конструкторы и другие методы
String (const char *);
String ();
String (const String &);
String (String &);
~String ();
int lenght () const {return len;};
//перегруженные методы оператора
String & operator= (const String &);
String & operator= (const char *);
char & operator[] (int);
const char & operator[] (int) const;
String operator+ (const String &) const;
//перегруженные дружественные операторы
friend bool operator< (const String &, const String &);
friend bool operator> (const String &, const String &);
friend bool operator== (const String &, const String &);
friend std::ostream & operator<< (std::ostream &, const String &);
friend std::istream & operator>> (std::istream &, String &);
friend String operator + (const char *, const String &);
//friend bool strcpm (const char * n, const char * m);
//статические функции
static int HowMany ();
void StringLow ();
void StringUp ();
int CharQuantity (char);
};
#endif |
|
методы
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
| #include <cstring>
#include "string1.h"
//инициализация статического элемента
int String :: num_strings = 0;
int String :: HowMany () {
return num_strings;
};
// методы класса
String :: String (const char * s) { //создание объекта String из строки
len = strlen (s); //установка размера
str = new char [len +1]; //разпределение памяти
strcpy (str, s); //инициализация указателя
num_strings++; //установка счетчика объекта
};
String :: String () { //конструктор по умолчанию
len = 1;
str = new char [1];
str [0] = '\0'; //строка по умолчанию
num_strings++;
};
String :: String ( const String & st) {
num_strings++;
delete [] str;
len = st.len;
str = new char [len + 1];
strcpy (str, st.str); //копирование строки в новое место
};
String :: String (String & st) {
num_strings++;
delete [] str;
len = st.len;
str = new char [len + 1];
strcpy (str, st.str); //копирование строки в новое место
};
String :: ~String () { //необходимый деструктор
--num_strings; //необходимо
delete [] str; //необходимо
};
//перегруженные методы оператора
//присваивание объекта string объекту string
String & String :: operator= (const String & st) {
if (this == &st)
return *this;
delete [] str;
len = st.len;
str = new char [len + 1];
strcpy (str, st.str);
return *this;
};
//присваивание строки объекту string
String & String :: operator= (const char * s){
delete [] str;
len = strlen (s);
str = new char [len + 1];
strcpy (str, s);
return *this;
};
//доступ чтения-записи char для объекта не-const String
char & String :: operator[] (int i) {
return str [i];
};
//доступ чтения char для объекта string
const char & String :: operator[] (int i) const {
return str [i];
};
String String::operator+ (const String & vary) const {
char * temp = new char [len + vary.len];
return String (strcat (strcpy (temp, str), vary.str));
};
String operator+ (const char * str, const String & vary) {
char * temp = new char [strlen (str) + vary.len];
return String (strcat (strcpy (temp, str), vary.str));
};
//перегруженные дружественные операторы
bool operator< (const String & st1, const String & st2) {
return (strcmp (st1.str, st2.str) < 0);
};
bool operator> (const String & st1, const String & st2) {
return (st2.str < st1.str);
};
bool operator== (const String & st1, const String & st2) {
return (strcmp (st1.str, st2.str) > 0);
};
//вывод String
std::ostream & operator<< (std::ostream & os, const String & st) {
os << st.str;
return os;
};
//быстрый ввод String/
std::istream & operator>> (std::istream & is, String & st) {
char temp [String::CINLIM];
is.get (temp, String::CINLIM);
if (is)
st = temp;
while (is && is.get () != '\n')
continue;
return is;
};
void String::StringLow () {
for (int i = 0; i < len; i++)
str [i] = tolower (str [i]);
};
void String::StringUp () {
for (int i = 0; i < len; i++)
str [i] = toupper (str [i]);
};
int String::CharQuantity (char l) {
int quantity = 0;
for (int i = 0; i < len; i++)
if (str [i] == l)
quantity++;
return quantity;
}; |
|
мэин
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
| #include "string1.h"
int main () {
using std::cout;
using std::cin;
String s1 (" and I am C++ student.");
String s2 = "Please enter your name: ";
String s3;
cout << s2;
cin >> s3;
s2 = "My name is " + s3;
cout << s2 << ".\n";
s2 = s2 + s1;
s2.StringUp ();
cout << "The string\n" << s2 << "\ncontains " << s2.CharQuantity ('A') << " A characters in it.\n";
s1 = "red";
String rgb [3] = { String (s1), String ("green"), String ("blue") }; //дебаг указывает на эту строку, как на косячную
cout << "Enter the name of a primary color for mixing light: ";
String ans;
bool success = false;
while (cin >> ans) {
ans.StringLow ();
for (int i = 0; i < 3; i++)
if (ans == rgb [i]) {
cout << "That's right!\n";
success = true;
break;
};
if (success)
break;
else
cout << "Try again!\n";
};
cout << "Bye!\n";
system ("pause");
return 0;
}; |
|
0
|