Является ли переменная объектом в ООП?

1,00
р.
Я, начинающий программист на C#, спорю сейчас с программистом на C++. Он утверждает, что в ООП переменная - это не объект, во всяком случае в C++. Я утверждаю, что переменная - это в корне тоже объект определенного типа в любом объктно-ориентированном языке. Кто из нас прав? Хотелось бы услышать мнение профессионалов.


Ответ
В С это не так — там просто нет понятия "объект". =)

Объект отличается от не объекта тем, что он имеет сложное и активное внутреннее устройство.
Не объект всего лишь является отображением участка памяти. Будь то просто число, указатель, некий обычный массив или структура. Действия над ними — просто оперирование данными в памяти. Взял, изменил, положил обратно. Вне зависимости от содержимого участка памяти. И переменная эта никаких возмущений в эти действия не вносит.
Объект — это тоже отображение участка памяти. Но только доступ к нему осуществляется уже не напрямую, а через посредников — через свойства, методы класса и т.д. То есть в любом случае происходит вызов некоторой процедуры, реализующей метод класса, которой передаются указатель на объект и аргументы (или как-то похоже). Что в этой процедуре произойдёт — одному разработчику известно. Ну и документации.
Моё мнение — в компилируемом и статически типизируемом языке обычно (но вовсе не обязательно) простые переменные не являются объектами.
В C# практически любая переменная — объект (как справедливо заметили, за исключением указателей). Ввиду того, что типы int, string, char и все иные — это, так сказать, синонимы соответствующих классов: System.Int32, System.String, System.Char. В С++ — нет.
А в динамически типизируемом языке у каждой переменной, как минимум, есть скрытые свойства - тип, например. И действия совершаются различные в зависимости от содержимого оного свойства. И оператор + числа сложит, строки склеит и т.д.