Код: Выделить всё
const A*
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Код: Выделить всё
const A*
Вообще то нет. Если класс знает хотябы один свой экземпляр, то его знает и любой метод. Соответственно любой метод может работать с любыми полями этого экземпляра. В данном случае класс знает все экземпляры и его методы могут работать с полями всех экземпляров.Romeo писал(а):Ну и теперь перейдём наконец-то к статическим методам. Любой даже начинающий программист С++ скажется, что статический метод - это метод, который может работать только со статическими полями класса, а ещё он может быть вызван без объекта класса.
Код: Выделить всё
class A
{
private:
static A *First;
static A *Last;
A *Previous;
A *Next;
...
};
Код: Выделить всё
const
A*
A::find (const std::wstring &s)
{
A *p;
for (p=First; p!=nullptr; p=p->Next)
{
if (p->s==s)
{
return (const A*)p;
}
}
return nullptr;
}
А чего за этим следить? Ничего лишнего в любом случае не меняется. Но представьте себе: объект сконструирован временно из литерала, или из экземпляра другого класса, потом передан методу по константной ссылке. Передавать по обычной ссылке нельзя, так как тогда окажется запрещена передача временных объектов. Передавать по значению может быть тоже нельзя из-за проблем с копированием полей и даже если таковых нет, всё равно нежелательно, так как это ведёт к копированию объекта и созданию лишнего объекта в памяти даже в том случае, если объект, для которого вызывается метод, не временный. Поэтому константная ссылка. Но этот методы вызывает для того же объекта ещё один метод. Вызвать не константный метод нельзя, так как объект - константа. А тот методы вызывает статический метод. Вызвать не константный метод опять нельзя, так вызывающий - константный. И не статическим этот третий метод тоже быть не может, так как может быть вызван откуда угодно и при этом вызов должен не зависеть от конкретных имён и адресов каких либо объектов. Более того, этот третий метод должен работать даже в том случае, если класс не имеет ни одного экземпляра в той области видимости, в которой вызывается. И даже в том случае, когда класс ещё не имеет вообще ни одного экземпляра.Romeo писал(а):И именно поэтому программисту придётся самому следить за тем, чтобы статический метод не менял статические поля класса, если ему требуется подобное поведение, так как на уровне компилятора запретить изменение просто невозможно.
я уже не распарсил.Romeo писал(а):Ты точно понял, что моё предложение, которое сам же выделил в своём сообщении?![]()