c++ 类中对象的引用

c++ 类中对象的引用,第1张

引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的 *** 作与对变量直接 *** 作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;

引用说明:

(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是空哗禅指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

int a=2,int &ra=a

a为目标原名称,ra为目标引用名。给ra赋值:ra=1等价于 a=1

(5)对引用求地址,就是对目标变量求地址。&ra与&a相等。即我们常说引用名是目标变量名的一个别名。别名一词好像是说引用不占据任何内存空间。但是编译器在一般将其实现为const指针,即指向位置不可变的指针。即引用实际上与一般指针同样占用内存。

(6)不能建立引用的数组。因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合。但是可以建立数组的引用.

例如: int&ref [3]= {2,3,5}//声明ref引用的数组错误

但是可以这样写:

const int (&ref)[3] ={2,3,5}//gcc编译的时候加上选项 -std=c++0x

ref[0] = 35//错误

为什么要加上const ,因为{2,3,5}此时是个字面值数组,是保存在代码段里,只读的属性,如果不加,编译错误,而且后面对ref[0]的赋值也不会成功.

需要特别强调的是引用并不产生对象的芦丛副本,仅仅是对象的同义词。因此,当下面的语句执行后:

pt1.offset(12,12);

pt1和pt2都具有(12,12)的值。

引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才

初始化它。例如下面语句是非法的:

Point &pt3;

pt3=pt1;

那么既然引用只是某个东西的同义词,它有什么斗尘用途呢?

下面讨论引用的两个主要用途:作为函数参数以及从函数中返回左值。

引用(reference)是c++对c语言的重要扩充。引用引入了对象的一个同义词。定义引用的表示方法与定激乎义指针相似,只是用&代替了*,例如: Point pt1(10,10)。

Point &pt2=pt1,定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。

需要特别明判悉强调的是引用并不产生对象的副本,仅仅是对象的同义词,引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。

循环结构:

循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。

四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预冲团料的错误。

特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。

这个问题很有意思,我之前还没碰到伏雹者缺薯过呢,我帮你在全球肆缺最大的编程论坛stackoverflow上搜了一个答案:

这个答案大意是说,C语言没有this指针,所以要自己写一个wrap API来封装C++的对象。

这个论坛高手云集,包括很多业界大拿,所以这个答案还是很可信的。下面的api.h 就是你要写的wrap API

C has no thiscall notion. The C calling convention doesn't allow directly calling C++ object member functions.

Therefor, you need to supply a wrapper API around your C++ object, one that takes the this pointer explicitly, instead of implicitly.

Example:

// C.hpp

// uses C++ calling convention

class C {

public:

bool foo( int arg )

}

C wrapper API:

// api.h

// uses C calling convention

#ifdef __cplusplus

extern "C" {

#endif

void* C_Create()

void C_Destroy( void* thisC )

bool C_foo( void* thisC, int arg )

#ifdef __cplusplus

}

#endif

Your API would be implemented in C++:

#include "api.h"

#include "C.hpp"

void* C_Create() { return new C()}

void C_Destroy( void* thisC ) {

delete static_cast<C*>(thisC)

}

bool C_foo( void* thisC, int arg ) {

return static_cast<C*>(thisC)->foo( arg )

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12293032.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存