标签:style class blog c code tar
作者 : 卿笃军
1)早在学习C语言的时候,我们就知道,在定义结构体的时候,不能在结构体中定义该结构体类型的变量:
struct node
{
int a;
// struct node b; //错
struct node *next; //对
};因为,该结构体还在定义中....不知道结构体里面具体有什么内容,所以无法定义对象b。但是可以定义指针*next。
2)现在,C++里面多出来了一个叫引用的东东(很强大):
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;
但是,需要注意几点(特别是第3点):
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
int a,&ra=a;
a为目标原名称,ra为目标引用名。给ra赋值:ra=1; 等价于 a=1;
(5)对引用求地址,就是对目标变量求地址。&ra与&a相等。即我们常说引用名是目标变量名的一个别名。别名一词好像是说引用不占据任何内存空间。但是编译器在一般将其实现为const指针,即指向位置不可变的指针。即引用实际上与一般指针同样占用内存。
(6)不能建立引用的数组。因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合。但是可以建立数组的引用.
3)那么,定义引用型类成员变量要注意些什么呢?
第一步:在类B中定义一个引用型A类成员变量 A &m_a1;
第二步:在B类的构造函数中对其进行初始化。
注意:a.因为你使用了引用型成员变量,所以B类不能有空构造函数(代码中已经将B(){}注释起来了,不能出现它)。
b.在B类构造函数中初始化的时候,引用型成员变量必须在初始化列表中进行初始化,不能在函数体中进行初始化。
(就是,必须在" : "号后面初始化,不能在函数体 { } 里面初始化)
4)另外,其它一些需要注意的事项,全部在下面的代码注释中进行了说明了。
示例:C++ 定义引用型类成员变量
#include <iostream>
using namespace std;
class A; //前向引用声明
class B
{
public:
// B(){} //不能有空构造函数
B(A &a):m_a1(a) {} //构造函数:同时给&m_a1引用初始化
void bPrint1(A &a) { cout<<"B1"<<endl; }
void bPrint2(A *a) { cout<<"B2"<<endl; }
// void bPrint3(A a) { cout<<"B3"<<endl; } //错
/* void bPrint(A &a)
{
a.aPrint(); //错
}
*/
private:
A &m_a1;
A *m_a2;
// A m_a3; //错
};
class A
{
public:
A(){}
void aPrint() { cout<<"A"<<endl; }
private:
};
int main()
{
A a;
B b(a);
return 0;
}tzdjzs的CSDN博客专栏,C++ 类成员引用变量的使用,http://blog.csdn.net/tzdjzs/article/details/2768363,2014年5月24日
标签:style class blog c code tar
原文地址:http://blog.csdn.net/qingdujun/article/details/26836445