6.11 引用与指针

SWIG支持C++的引用,但将其转换成指针。例如,像这样的声明:

  1. class Foo {
  2. public:
  3. double bar(double &a);
  4. }

访问函数是这样的:

  1. double Foo_bar(Foo *obj, double *a) {
  2. obj->bar(*a);
  3. }

作为特例,多数的语言模块对传递const原生数据类型的引用(int、short、float等)的处理成传值,而不是指针。例如,有这样的函数:

  1. void foo(const int &x);

在脚本语言中可以这样调用:

  1. foo(3) # Notice pass by value

返回引用的函数被映射为指针。例如:

  1. class Bar {
  2. public:
  3. Foo &spam();
  4. };

生成的访问函数像这样:

  1. Foo *Bar_spam(Bar *obj) {
  2. Foo &result = obj->spam();
  3. return &result;
  4. }

但是,返回原生类型(int、short等)的const引用的函数一般通过值而不是指针。例如,下面的函数:

  1. const int &bar();

在目标语言中可能返回类似37或42这样的值而不是指针。

不要返回在堆栈上分配的变量的引用!SWIG不会拷贝对象,所以这可能会导致你的程序崩溃。

对原生类型的特殊处理时必要的,这提供了对更多C++高级特性的无缝集成——特别是关于模板和STL。这个特性从SWIG-1.3.12开始引入。