2013-05-21 3 views
2

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

 class A{ 

      A doSomething(); 

     }; 

     A A::doSomething(){ 

      //doing something 

     } 

Вместо того чтобы делать это

 class A{ 

      A doSomething(){ 

       //doing something 

      } 

     }; 

Во всяком случае, я пересматривал курс мой профессор, и я нашел это:

"Toute fonction: Новичок définie данс са Classe (данс ла ДЕКЛАРАЦИЯ-де-ла)

Wh ich переводит;

«Все функции-члены, определенные в классе (в классе декларации) не рассматривается компилятором как функцию инлайн. Ключевое слово„инлайн“больше не используется»

Я понимаю, примыкают встроенные функции - это работа как макросы. Компилятор копирует весь блок кода в каждый экземпляр, вызываемый функцией.

Мой вопрос: Правильно ли это утверждение в курсе моего профессора, и если да, в чем причина этого?

+0

'inline' не имел никакого отношения к встраиванию с навсегда. Он имеет немного семантического ввода (он поднимает одно правило определения и, возможно, что-то еще, что я забываю), но он не подразумевает и не требует, чтобы функция была встроена компилятором. – delnan

ответ

8

Ваше утверждение вашего профессора правильное, ваше понимание того, что означает inline. Функция inline допускает множество определений между единицами трансляции и не обязательно означает, что вызов фактически встроен (т. Е. Расширен как макрос).

Если вы определяете свободную функцию в заголовке без inline или static и включаете этот заголовок в несколько единиц перевода, вы нарушите одно правило определения.

Функции-члены аналогичны, если они не помечены как встроенные (которые они неявно находятся внутри определения класса).

3

Ключевое слово inline не означает встроенного в C++, то это означает только то, что несколько определений точно такие же функции можно увидеть в разных единицах трансляции, которые получают связаны без того является нарушением One Definition Rule.

Учитывая это, функции-члены определены внутри. Определение класса неявно включено. Все единицы перевода, которые включают этот заголовок, могут генерировать один и тот же символ, и компоновщик будет отбрасывать все, кроме одного из них.

Смежные вопросы