`
huanggaole
  • 浏览: 10489 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA转型C++(二):引用与指针

 
阅读更多
引用与指针
一、引用
    引用为变量提供了一个别名,对引用所作的任何操作都作用于它所指向的对象。声明方式:
int& score = myScore;

    注意:1.引用必须在声明的时候指向另一个值,如果不对其进行初始化会导致编译错误。
          2.关于引用运算符&的位置,可以是"int& score"或"int & score"或"int &score"都可以,但是它只能修饰离它最近的变量名。例如:"int& score = myScore,age = myAge;"中,只有前者的score引用了myScore,后者的age是普通的数值赋值。
          3.引用的关联只在声明时创建,之后对引用变量的赋值都是对与之关联的变量进行操作。例如:"int& score = myScore;score = hisScore;score = 100;"的作用是声明了一个与myScore关联的引用,然后将hisScore赋值给myScore,然后将100赋值给myScore,至始至终hisScore的数值没有发生改变。

    C语言中也有按值传递与引用传递,在JAVA中,函数间进行传参时,基本数据类型是值传递,对象类型是引用传递。而在C++中,则根据声明的参数来确定是值传递还是引用传递。例如:
void swap1(int a,int b);  //值传递,函数中的参数a,b不会对传入的实参产生影响
void swap2(int& a,int& b);//引用传递,函数中的参数a,b就是传入参数的别名。


    值传递是将实参进行一次拷贝生成了形参,形参具有独立的内存空间且其改变不会影响到实参。但是这种传递是要进行复制的,当传入的是结构体、对象或大数组时,值传递十分低效。因此当函数中的形参值不需要改变,只是用来读操作的话,可以用常量引用声明参数:
void display(const vector<string>& vec);//引用传递向量,不允许函数对其修改


    同理,在返回一个数据并赋值时,同样要进行拷贝操作。如果返回的类型过大,我们也可以考虑返回一个引用:
string& refToMain(vector<string>& inventory, int i)
{
    return inventory[i];
}

    以上函数返回的是向量inventory中第i个元素的值。主函数中可以声明一个引用来接收该函数的返回值:
string& rStr = refToMain(inventory,1)

    由于是引用返回,因此不需要进行拷贝操作。但是要注意的是,必须保证函数结束后,返回的引用还在。例如下面的函数是不可取的,因为它返回的引用在函数结束后将不复存在:
string& refToMain()
{
    string s = "stringwilldestroy";
    return s;
}


二、指针
    指针的本质是一个包含内存地址的变量。指针的声明方式如下:
int* pAPointer = 0;

    注意:1.与引用运算符&类似,星号的位置也有三种情况,都可以。而且也只能修饰最近的那个变量。
          2.以上将0赋给指针有特殊的含义,即该指针不指向任何内存。或在定义时指向NULL(iostream中的常量)。
   
    因为指针存储对象的地址,所以需要有为指针赋予地址的方法。一种方法是获取已有变量的内存地址,并将其赋值给指针。如下面代码所示:
int* pScore;
int score;
pScore = &score;

    这里的“&”是放在变量前的,它的作用是取地址,因此在这里它叫取址运算符。
    而要用pScore来访问score则需要用到解引用。前面的迭代器已经提到过,解引用运算符“*”。以下代码是用来访问score中的值:
*pScore = 100;//这一句与score = 100;是同一个效果 

    注意:1.不要对空指针做解引用操作。
          2.修改指针指向的对象的值时不要修改指针的值。例如pScore + 500并不是对score增加500,而是将存储在pScore中的地址增加500指向了另一块内存空间。
    另外特别注意以下的写法,这是用来获取score的地址:
cout << pScore;//这一句与cout << &score;是同一个效果,输出的是score这个变量的内存地址。 

    与引用不同,指针可以在程序运行期间的不同时刻指向不同的对象。对指针重新赋值与变量的重新赋值一样。下面一行代码对pScore进行了重新赋值。
pScore = &newScore;//注意*pScore = newScore;则是将newScore的值赋给score

    指针可以使用“->”运算符以一种更具有可读性的方式来访问对象成员。例如:
cout << pStr->size();
cout << (*pStr).size();

    这两条语句是等价的。但是上面一条更具有可读性。
   
    引用中常量引用。同样的,指针中也有常量指针。通过在声明和初始化指针时使用const来限制指针的行为。这些限制如同保护措施,可以让程序的意图更加明确。例如以下语句:
int score = 100;
int * const pScore = &score;

    上面的代码创建了一个指向score的常量指针pScore。创建的方法是在声明时将const置于指针名称之前。第一次声明常量指针时必须对其进行初始化。实际上常量指针与引用是可以相互转化的。
    pScore是常量指针,因此它永远不能指向其他任何内存地址,但是可以用它来改变其指向的值。这一点跟引用是很类似的。
   
    除了常量指针外,还有一种用const来修饰的指针,可以实现无法用该指针来修改其指向的值。这种指针叫做指向常量指针。声明的方式是将const关键字置于指针所指向值的类型之前。例如以下语句:
const int* pNumber;

    这种声明方式可以不给指针赋初值,而且在编程中可以改变指针的指向,但是不能修改这个指针所指向的变量的值。例如下面的代码是非法的:
*pNumber = 1;


    如果希望指针所指的变量不能改变,指向变量的值也不能修改,那么只需要结合常量指针与指向常量指针就能定义指向常量的常量指针。例如以下语句:
const int* const pBONUS = &BONUS;

    顾名思义,指向常量的常量指针是限制条件最多的一条指针,它既不能改变指向,也不能修改指向的变量,而且定义时必须赋初值。

    对于C++,在函数传递中,除了值传递和引用传递,还有第三种传递,就是指针传递。其实原理跟引用传递差不多,而指针与引用本身就是一种原理。所以在此不再赘述。

    还要注意一点,那就是指针与数组有着密切的联系。实际上,数组名是指向数组第一个元素的常量指针。因为数组元素存储在连续的内存块中,所以可以把数组名当做指针使用来实现数组元素的随机访问。
   
分享到:
评论

相关推荐

    C++必知必会_c++类型转换_C++字符pdf_Vc_

    最后,`dynamic_cast`用于运行时的多态类型转换,它在基类指针或引用指向派生类对象时特别有用,可以安全地向下转型。 在C++中,字符串处理也是重要的一部分。C++标准库提供了`std::string`类来处理字符串,可以...

    java 精选面试题及答案

    3. Java与C++的区别:自动内存管理(垃圾回收)、没有指针、异常处理机制等。 二、语法基础 1. 变量的声明和初始化:包括基本类型变量和引用类型变量。 2. 数据类型:原始类型(整型、浮点型、字符型、布尔型)和...

    Effective C++ 中文版

     ·洞察 C++和其他语言(例如Java、C#、C)之间的不同。此举有助于那些来自其他语言阵营的开发人员消化吸收 C++ 式的各种解法。 目录: 译序 中英简繁术语对照 目录 序言 致谢 导读 1.让自己习惯C++ ...

    java方法匹配原则

    #### 二、父类引用与子类对象 ##### 2.1 向上转型与向下转型 在Java中,向上转型(即子类对象赋值给父类引用)是自动进行的。然而,向下转型(即父类对象赋值给子类引用)需要显式地进行强制类型转换。 例如: `...

    JAVA基础阶段总结

    - **强制转型与自动转型**:在 JAVA 中,子类对象可以自动转换为父类类型(自动转型),而父类对象转为子类类型时需要显式转换(强制转型)。 - **空指针异常**:当试图访问一个 null 对象的成员变量或调用其方法时...

    2009年java课件第一章

    Java去除了C/C++中的指针运算、结构、typedefs、#define以及手动内存管理等特性,以提高安全性并降低编程难度。Java和C++各有特色,两者并存,都是开发者需要掌握的重要语言。 【Java技术体系】 Java技术分为三个...

    Partial-Java-to-C-Translator:vtable,函数指针,类型转换,继承

    《从Java到C的部分翻译器:深入理解vtable、函数指针、类型转换与继承》 在编程领域,Java和C是两种截然不同的语言,它们各有特点,但也有各自的局限性。本项目"Partial-Java-to-C-Translator"旨在为开发者提供一个...

    Java程序设计与开发[张晓龙]

    Java语言以C++为基础,但简化了许多复杂性,如指针操作,并引入了垃圾回收机制,使得内存管理更加安全。 在Java程序设计中,面向对象编程(OOP)是核心概念。这包括类、对象、封装、继承、多态等关键元素。类是对象...

    面向对象程序设计JAVA期末复习题选择、填空

    - **简单性**:Java 语法简洁,避免了C++的一些复杂特性,如指针操作。 - **分布性**:Java 支持网络编程,便于在网络环境中部署和执行。 - **多线程**:内置的多线程支持使得处理并发任务变得简单。 - **解释型...

    黑马程序员入学Java知识——精华总结.doc

    - **简单性**:Java简化了C++的一些复杂特性,如指针,使得初学者更容易上手。 - **面向对象**:Java强调类和对象,支持封装、继承和多态,便于构建复杂的软件系统。 - **安全性**:Java提供了安全管理机制,防止...

    武汉大学Java培训讲义

    - **转型与命名**:随着互联网的发展,Oak逐渐转向了网络应用开发,由于名称Oak已被注册,因此项目更名为Java。 - **发展轨迹**:自1994年以来,Java逐渐成为一种广泛应用的语言,其类库不断丰富,性能持续提升,...

    C++ Annotations V9.6

    该文档作为Frank在格罗宁根大学组织的C++编程课程的主要教材,目的是为那些熟悉C或其他使用类似C语法的语言(如Perl或Java)的用户深入了解或转型到C++。尽管如此,该文档并不涵盖C++的所有方面,特别是当C++的语法...

    java程序设计语言教程 java程序设计语言教程

    - **语法结构**:Java的语法与C++相似,但更注重安全性,包括自动内存管理,避免了C++中的指针问题。 - **类与对象**:Java基于面向对象编程(OOP),一切皆为对象,类是创建对象的模板。 - **封装、继承和多态**...

    Java多态性定义与用法实例详解

    在JVM中,类实例的引用就是指向一个句柄(handle)的指针,这个句柄是一对指针:一个指针指向一张表格,实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的...

    JAVA发展历程

    Java 语言借鉴了 C++ 的语法风格,但去除了 C++ 中容易引发错误的部分,例如指针和操作符重载。Java 提供了自动的内存管理和垃圾回收机制,极大地简化了开发者的任务,让他们可以更加专注于应用程序的核心逻辑。 **...

    Java面试宝典2012版

    2. **Java中无goto**:Java语言中没有`goto`关键字,这与C/C++不同。它鼓励使用结构化的控制流,如`break`和`continue`来控制循环。 3. **&和&&的区别**:`&`是按位与运算符,而`&&`是逻辑与运算符。在布尔表达式中...

    JAVA_J2EE大面试(全)

    #### 二、Java与C++的区别 **知识点1:内存管理** - Java采用自动垃圾回收机制来管理内存,而C++需要程序员手动管理内存。 - Java的内存管理更加安全可靠,减少了内存泄漏和悬挂指针等问题的发生。 **知识点2:类...

    From C++ to Objective-C

    - **nil、Nil、id**: `nil`表示空引用,类似于Java中的`null`。`Nil`是`nil`的大写形式,但在Objective-C中通常不使用。`id`是Objective-C中的通用对象指针类型,可以指向任何对象。 - **SEL**: `SEL`是一个特殊...

    \\java类、抽象类、接口、继承和对象解析 .doc

    对象引用是编程中用来访问对象的机制,类似于 C/C++ 中的指针。在 Java 中,当我们声明一个对象并使用 `new` 关键字时,实际上是创建了对象并在内存中分配空间,然后将对象的引用赋值给变量。如果只有引用而没有...

    C语言家族的发展史

    #### 1998年至2000年:Java的转型与竞争 - **再定位**:面对Java小程序的衰落,Sun再次调整战略方向,将Java定位为服务器端语言。 - **竞争**:与此同时,微软发布了.NET框架,提供了与Java EE相似的功能,但具有更...

Global site tag (gtag.js) - Google Analytics