C++Primer 学习笔记之指针和引用

1、引用概念

引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&带起了*。

例如:Point pt1(10,10);

Point &pt2 = pt1;//定义pt2为pt1的引用。通过这样的定义,pt1和pt2表示同意对象,需要特别强调的是引用并不是产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:

pt1.ofset(2,2);

pt1和pt2都具有了(12,12);

引用必须在定义的时候马上初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才初始化它。例如下面是非法的:

Point &pt3;

pt3 = pt1;

2、引用简介

引用就是某一个变量(目标)的别名,对引用的操作与对变量直接操作一样。

引用的声明方法:类型标识符 &引用名 = 目标变量名

例如:

int a;

int &ra = a;//定义引用ra,它就是变量a的引用,即别名。

说明:

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

(2)类型标识符是指目标变量的类型

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

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

ra =1;等价于a=1;

(5)声明一个引用,不是新定义一个变量,它之表示该引用时目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不会给引用分配存储空间;所以对引用球地址就是对目标变量球地址。&ra =与&a相等。

(6)不能建立数组的引用。因为数组是一个有如干元素所组成的集合,所以无法建立一个数组的别名。

3、引用的应用

引用的一个重要作用就是作为函数的参数。以前的C语言中的函数是值传递,如果有大块数据作为参数传递的时候,采用的方法往往是指针,因为这样做可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++)中有增加了一种同样的有效率的选择,就是引用。

例如:

void swap(int &p1,int &p2)

{

int  p;

p = p1;

p1 = p2;

p2 = p;

}

int  main()

{

int a,b;

cin>>a>>b;

swap(a,b);

cout<<a<<b<<endl;

}

4、指针与引用的差异

1)定义引用时没有初始化是错误的。

2)给引用赋值修改的是该引用所关联对象的值。(指针 存储的是它指向的变量的地址。解引用, 就是引用它指向的变量的值。引用本身就是目标变量的别名)

[cpp] view plaincopy

string str("hello world");

string &rstr1;      //ERROR

string &rstr2 = str;

rstr2 = "nihao shijie";

cout << str << endl;

int ival = 1;

int ival2 = 2;

int &r1 = ival,&r2 = ival2;

r1 = r2;

cout << r1 << endl;

cout << ival << endl;

4、具体可以参考博文讲解的很详细

http://www.360doc.com/content/13/0121/19/3398926_261617220.shtml

C++Primer 学习笔记之指针和引用

时间: 2024-10-29 19:06:06

C++Primer 学习笔记之指针和引用的相关文章

C++ Primer 学习笔记_57_类与数据抽象 --管理指针成员

复制控制 --管理指针成员 引言: 包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象! 将一个指针复制到另一个指针时,两个指针指向同一对象.当两个指针指向同一对象时,可能使用任一指针改变基础对象.类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在.指针成员默认具有与指针对象同样的行为. 大多数C++类采用以下三种方法之一管理指针成员: 1)指针成员采取常规指针型行为:这样的类具有指针的所有缺陷但无需特殊的复制控制! 2)类

C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针

C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针 1.引言 在前面提到过,成员函数具有一个附加的隐含形参,即指向该类对象的一个指针.这个隐含形参命名为this. 2.返回*this 成员函数有一个隐含的附加形参,即指向该对象的指针,这个隐含的形参叫做this指针(编译器自动传递)使用this指针保证了每个对象可以拥有不同数值的数据成员,但处理这些成员的代码可以被所有对象共享.成员函数是只读的代码,由所有对象共享,并不占对象的存储空间,因为this指针指向当前对象,所以

C++ Primer 学习笔记_103_特殊工具与技术 --类成员指针

特殊工具与技术 --类成员指针 成员指针可以做到:获得特定成员的指针,然后从一个对象或别的对象获得该成员.成员指针应该包含类的类型以及成员的类型. 一.声明成员指针 测试类: class Screen { public: typedef std::string::size_type index; char get() const; char get(index ht,index wd) const; private: std::string contents; index cursor; ind

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr)、C++对象模型

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr).C++对象模型 一.虚函数表指针(vptr)及虚基类表指针(bptr) C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括: virtual function机制:用以支持一个有效率的"执行期绑定": virtual base class:用以实现多次在继承体系中的基类,有一个单一而被共享的实体. 1.虚函数表指针 C++中,有两种数据

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++学习笔记31,指向引用的指针(3)

我们来看一个简单的指向引用的指针的例子. #include <iostream> using namespace std; int main(){ int x=10; int y=20; int &rtx=x; //不要写成了int& *ptrx=&rtx; //因为rtx的本质是一个int int *ptrx=&rtx; *ptrx=15; ptrx=&y; rtx=y; cin.get(); } 依次单步执行:(注意rtx值的变化和ptrx的变化)

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类

特殊工具与技术 --嵌套类 可以在另一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这样的类是嵌套类,也称为嵌套类型.嵌套类最常用于定义执行类. 嵌套类是独立的类,基本上与它们的外围类不相关,因此,外围类和嵌套类的对象是互相独立的.嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员. 嵌套类的名字在其外围类的作用域中可见,但在其他类作用域或定义外围类的作用域中不可见.嵌套类的名字将不会与另一作用域中声明的名字冲突 嵌套类可以具有与非嵌套类相同

C++ Primer 学习笔记_102_特殊工具与技术 --运行时类型识别[续]

特殊工具与技术 --运行时类型识别[续] 三.RTTI的使用 当比较两个派生类对象的时候,我们希望比较可能特定于派生类的数据成员.如果形参是基类引用,就只能比较基类中出现的成员,我们不能访问在派生类中但不在基类中出现的成员. 因此我们可以使用RTTI,在试图比较不同类型的对象时返回假(false). 我们将定义单个相等操作符.每个类定义一个虚函数 equal,该函数首先将操作数强制转换为正确的类型.如果转换成功,就进行真正的比较:如果转换失败,equal 操作就返回 false. 1.类层次 c