C++ 定义引用型类成员变量

作者 : 卿笃军

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;
}

参考文献:百度百科,C++引用,http://baike.baidu.com/view/2129184.htm,2014年5月24日

tzdjzs的CSDN博客专栏,C++ 类成员引用变量的使用,http://blog.csdn.net/tzdjzs/article/details/2768363,2014年5月24日

C++ 定义引用型类成员变量

时间: 2024-10-13 12:32:30

C++ 定义引用型类成员变量的相关文章

C++---类成员变量定义为引用

摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #include <iostream> using namespace std; class A { public: A(int k):a(n){ // 必须要在初始化列表中进行初始化 n = k; cout << a <<endl; } int get() const { r

const型类成员

一.关于const类成员函数有以下几个需要注意的地方: 1. 在普通的非const成员函数中,this的类型是一个指向类类型的const指针,而const成员函数中,this的类型是一个指向const类类型对象的const指针.由于这个原因: (1) 返回值 函数名 (参数列表) const {…} 这种格式只能用在类的成员函数中,非成员函数只能使用这种形式:void f1(const std::string& s):(2) 如要返回该类对象的引用(*this),则在返回值声明前加上const(

变量,final常量,类成员变量,static关键字,实例变量,静态变量,局部变量

1.常量:又称为final变量,在整个程序中仅能被赋值一次 final int num = 1215; num = 1216; // 错误,仅能赋值一次 2.类成员变量:不在方法中定义的变量即为成员变量,在方法体内定义的变量则为局部变量 成员变量含义:对象的属性 public class Book{ int id; string name; //两个成员变量 public String getName(){ int id = 0;  //局部变量,必须进行赋值或初始化 } } 3.static关

Objective-C类成员变量深度剖析

目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objective-C类不能动态添加成员变量 总结 看下面的代码,考虑Objective-C里最常见的操作之一——类成员变量访问. - (void)doSomething:(SomeClass *)obj { obj->ivar1 = 42; // 访问obj对象的public成员变量 int n = sel

Qt一个工程调用另一个工程的类成员变量

一句两句话已经不能表达现在的激动情绪了,唯有感叹知识的博大精深,并把感叹转变为文字. 同一个工程调用其他类成员变量非常简单. 如: 定义 Test1.h中申明成员变量 class A { public: double m_fTest; }; Test1.cpp中改变成员变量的值. m_fTest = 265.78; 然后再类B中调用类A的成员变量m_fTest,并需求类A中改变该值时,类B中也要随之改变: 调用方法:包涵类A的头文件 #include "test1.h" 然后在调用处声

Python的类成员变量默认初始值的坑

问题发现:一个循环内,缺省值初始化同名变量,其中的list成员不是空,会延续之前同名变量的值. 示例代码: # Define class class Variant(): # use def __init__(self, price = 500, description = 'default description', values = ['', '', '']): self.price = price self.description = description self.values = v

类成员变量初始化的问题

class window{ window(int maker){ System.out.println("window"+maker); } } class House{ window w1 ;//new window(1); window w3 = new window(3); House(){ System.out.print("House"); w3 = new window(33); } window w4 = new window(4); } class

PHP 类成员变量规范得一些理解。

今儿写代码是发现一个问题: PHP 类 成员变量不能接受方法得返回值 做以下测试: bin_2.php <?php /** * Created by PhpStorm. * User: Administrator * Date: 14-12-4 * Time: 下午9:45 */ header("Content-type:text/html;charset=utf-8"); require_once('bin_1.php'); require_once('bin_3.php');

php 类 成员变量 $this-&gt;name=&#39;abc&#39;

<?php class test { public function getName() { $this->name='abc'; echo $this->name; } }$a=new test();$a->getName(); 1.$this->name='abc'对应的BNF范式 expr_without_variable: variable '=' expr { zend_check_writable_variable(&$1); zend_do_assign