Стандарт C ++ не определяет, как указатель this
и любые аргументы передаются в конструктор (или любую функцию в этом отношении). Это работа ABI (Application Binary Interface), и различные компиляторы могут - и в реальном мире - использовать разные ABI. ABI не является частью стандарта C ++.
Я предполагаю, что оба языка, которые вы хотите использовать, скомпилированы в машинный код с использованием компилятора, поскольку это облегчает обсуждение. Аналогичные принципы применяются к интерпретируемым и другим языкам, но конкретные детали различаются.
Вообще говоря, для правильного вызова любой функции C ++ из другого языка оба языка должны быть либо переведены в один и тот же ABI соответствующими языковыми компиляторами, либо должны быть определены / документированы средства взаимодействия двух разных ABI. Другими словами, оба компилятора - и машинный код, который они генерируют - должны быть разработаны для взаимодействия.
Практически, стандарт C ++ определяет, как он взаимодействует с C на уровне языка. C не может использовать все конструкции C ++, но функции extern "C"
создаются компилятором C ++ таким образом, чтобы их можно было вызывать из C. Совместимые компиляторы C и C ++ - или код, который они генерируют - могут поэтому взаимодействовать, предполагая, что оба Компиляторы поддерживают один и тот же ABI. Например, g ++ (интерфейс компилятора gnu C ++) и gcc (интерфейс компилятора gnu C) предназначены для взаимодействия, но они (не обязательно) взаимодействуют с компиляторами других поставщиков. Технически может быть возможным, чтобы вывод машинного кода компилятором gnu C взаимодействовал с выводом кода компилятором C от другого поставщика, но для этого требуется очень подробное знание того, как работают ABI, поддерживаемые обоими компиляторами (и преднамеренная поддержка обоими поставщики).
Для того, чтобы другие языки могли взаимодействовать с C ++, эти опции менее просты. Обычно общим знаменателем является C - другие языки предоставляют возможность взаимодействия с C, как и C ++, поэтому некоторый интерфейс C используется в качестве посредника между ними. Например, код, который создает экземпляр объекта в C ++, может быть помещен в функцию extern "C"
. Затем этот код может быть скомпилирован с использованием компилятора C ++, и результирующая функция имеет интерфейс, позволяющий вызывать его из кода C. Если другой язык (или компилятор) поддерживает взаимодействие с C (то есть соответствует требованиям к правильному интерфейсу для вызова функции C), тогда эту функцию C можно вызывать из других языков.