Не пойму как работает класс

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

Код: Выделить всё

#include <stdafx.h>
#include <conio.h>
using namespace std;
class String {
public:
	char* ptr;
	String(char* s){
	int n = strlen(s);
    ptr = new char[n + 1];
    strcpy(ptr, s);
	}
	String(){
		ptr=new char[1];
		ptr[0]='\0';
	}
	~String(){
	delete [] ptr;
	cout << "dectruction " << endl;
}
	int operator==(const String &other){
    return (strcmp(ptr, other.ptr) == 0);
	}
    operator char*() {
				return ptr;
	}
};
int main() {
    String a("STRING 1");
    String b("STRING 2");
    String c;                
    cout << "The value of a is: " << endl;
    cout << a << endl;
    cout << "The value of b is: " << endl;
    cout << b << endl;
	cout << "The value of c is between these brackets<";
    cout << c << ">" << endl;
}

Код: Выделить всё

cout << a << endl; 
Вызывается это

Код: Выделить всё

operator char*() {
return ptr;
Как компилятор узнает какой ptr возвратить, их же несколько
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

почему несколько? один на объект...
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Компилятор действует следующим образом. Сначала он пытаешься найти соответствующий внешний оператор << со вторым параметром String. Естественно он такого не находит. Тогда его следующий ход - перебрать все операторы приведения у класса String и найти среди них тот, для которого определён внешний оператор <<. При проверке первого же оператора приведения operator char*() он находит внешний оператор << (const std: :o stream& stream, const char* str), который определён в <ostream> и вызывает его, передав ему в качестве второго параметра то, что вернул operator char*().
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить