LINUX.ORG.RU

[C++] static в объявлении функции-члена

 


0

2

Зачем функцию-член объявлять с атрибутом static? Я сейчас смотрю на идиому «именованый конструктор» (named constructor), там все они объявляются как static. Моя функция тоже конструирует новый объект по старому (что-то типа копирующего конструктора, но начальный и конечный объекты отличаются). Должен ли я тоже объявить ее как static или это не нужно? Какие преимущества и недостатки объявления со static?

★★★★★

Как я понимаю, одно из достоинств — ограничение области видимости, так?

unanimous ★★★★★
() автор топика
Ответ на: комментарий от unanimous

>ограничение области видимости
Не очень понятно, что именно имелось в виду.

Насколько я помню, static-модификатор просто позволяет вызывать функцию без создания объекта этого класса.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Не очень понятно, что именно имелось в виду.

When modifying a variable or function at file scope, the static keyword specifies that the variable or function has internal linkage (its name is not visible from outside the file in which it is declared)

Взято из мануала (сорри за майкрософт)

unanimous ★★★★★
() автор топика
Ответ на: комментарий от trex6

> Насколько я помню, static-модификатор просто позволяет вызывать функцию без создания объекта этого класса.

ОК, this makes sense

unanimous ★★★★★
() автор топика
#include <iostream>
struct A
{
  A() { std::cout << "Constructor" << std::endl; }
  static void func() { std::cout << "func called" << std::endl; }
};

int main()
{
  A::func();
}
$ g++ test.cpp -o test
$ ./test 
func called
DELIRIUM ☆☆☆☆☆
()

В C++ static может иметь три различных значения

elverion
()
Ответ на: комментарий от trex6

Да, ты прав. Но как тогда понимать это

When modifying a member function in a class declaration, the static keyword specifies that the function accesses only static members.

unanimous ★★★★★
() автор топика
Ответ на: комментарий от unanimous

ОК, все, понял:

Static member functions are considered to have class scope. In contrast to nonstatic member functions, these functions have no implicit this argument; therefore, they can use only static data members, enumerators, or nested types directly. Static member functions can be accessed without using an object of the corresponding class type.

Всем спасибо за помощь и содействие!

unanimous ★★★★★
() автор топика

Статик метод можно вызывать всегда независимо от того, создан ли объект(ы) или нет. Ограничение - нельзя обращатся к нестатическим свойствам класса.

Какие преимущества и недостатки объявления со static?

преимущества: статик не имеет скрытого параметра this, т.е. его можно использовать как обычную ф-ю. (когда тред pthread_create создаёшь, нужна ф-я, но не метод. А статик метод можно использовать).

недостатки: как уже написал, нельзя обратиться к нестатическим свойстам и методам класса.

mi_estas
()

Sort of offtopic.
Зачем может понадобиться static-метод, который внутри себя создает временный объект своего же класса, вызывает у него метод этого объекта, после чего объект удаляется, а результат возвращается?

anonymous
()
Ответ на: комментарий от mi_estas

На самом деле тут скорее своя философия.
По сути у тебя в классе получается 2 контекста.
1й - класс, который может порождать объекты.
2й - объект, существующий внутри класса и имеющий свой собственный интерфейс. (static-объект)

trex6 ★★★★★
()
Ответ на: комментарий от mi_estas

Нет, я о статических методах и полях класса. Они, по сути, образуют отдельный объект внутри класса. Во всяком случае, мне удобнее думать о них именно так.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Это конечно твоё личное дела, как их себе представлять. А как по мне, так они от обычных сишных ф-ый мало чем отличаются. За исключением некоторых нюансов конечно.

Да, и это, не стоит забывать, что этот «статический объект в классе» всегда в одном экземпляре. Но думаю, ты и сам об это знаешь.

mi_estas
()
Ответ на: комментарий от mi_estas

>от обычных сишных ф-ый
У них есть общий контектс - статические поля класса. Вот и получается методы+данные=объект класса =)

trex6 ★★★★★
()
Ответ на: комментарий от anonymous

> Зачем может понадобиться static-метод, который внутри себя создает временный объект своего же класса, вызывает у него метод этого объекта, после чего объект удаляется, а результат возвращается?

Затем, что при конструировании можно сделать какие-то вычисления, но вызов метода по сигнатуре совпадают с каким-нибудь конструктором, который уже имеется. Тогда единственный способ — дать этому методу другое имя (или по логике так получается). Классический пример: создание объекта Point, представляющий собой точку декартового пространства как по значениям декартовых координат так и по значениям полярных.

А чем оно лучше простой С-шной функции --- область видимости. Статический член класса при обращении будет требовать квалификатора имени класса, а имя С-шной функции будет торчать в глобальном пространстве имен что некомильфо часто.

unanimous ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> Зачем может понадобиться static-метод, который внутри себя создает временный объект своего же класса, вызывает у него метод этого объекта, после чего объект удаляется, а результат возвращается?


Это какой-то норкоманский приход. Либо криво отрефакторенный код, либо криво понятый и «примененный» паттерн.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> Это какой-то норкоманский приход. Либо криво отрефакторенный код, либо криво понятый и «примененный» паттерн.

Скорее первое. У меня просто внезапно появилась мысль, применимость которой я не смог оценить сам. Такого в реальном коде не видел.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.