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

JAVA转型C++(三):面向对象

 
阅读更多
一、类

    C++中定义类的机制与JAVA很不相同。在C++中定义类的方法是:以关键字class开头,然后是类的名称。类主体用花括号括起来,并以一个分号结尾。
    类的定义中需要声明数据成员与数据函数。可以在类定义的外部定义成员函数。要在类的外部定义函数,需要用类名与域解析运算符(::)来对其进行限定,以便让编译器知道该类定义属于哪个类。
    类中的数据成员可以使基本数据类型,也可以是其他对象类型。我们可以使用面向对象编程中的聚合体来模拟这种对象之间的关系。

    数据成员的访问以及成员函数的调用在C++中均与JAVA类似,不再赘述。需要注意的是C++中的对象实例化与基本数据类型的声明一样,都是“类名 对象名;”的形式。在C++中的new关键字是动态分配内存,返回的是新建对象的地址,而且分配的内存都是要靠delete()函数回收的,否则会造成内存泄露。
    到目前为止,无论何时定义一个变量,C++都会为其分配所需的内存。常规的定义方式中,当创建变量的函数结束时,C++会释放这部分内存。这部分用于局部变量的内存成为栈。但是用new关键字(以及C语言中malloc关键字)创建的内存是一种与程序中的函数保持独立的内存。这部分内存由程序员负责分配与释放。它们统称为堆(或自由存储区)。
    new运算符在堆中分配内存,然后返回其地址。如以下代码:
int* pHeap = new int;
int* pHeap2 = new int(10);//为刚开辟的空间赋值为10
int* pHeap3 = intOnHeap();
int* intOnHeap()
{
  int* pTemp = new int(20);//这里声明的int*是堆内存,因此可以作为指针返回。
  return pTemp;
}

    与栈中局部变量的存储不同,堆中分配的内存必须显式地释放。当不再使用已经用new分配过的内存时,应当使用delete将其释放。如以下代码所示:
delete pHeap;

    但是要注意的是,delete语句仅仅释放掉了pHeap所指向的内存,而pHeap本身依然指向那块内存。这个指针变成了野指针。为了防止对野指针解引用出错,我们要对野指针重新赋值:
pHeap = 0;

    如果new的内存没有及时delete,会造成内存泄露。

二、几种特殊的函数

    1.构造函数
    与JAVA有所不同的是,C++类中的函数定义中有一种叫做成员初始式的技巧:当有多个数据成员需要根据传来的参数赋值或初始化时,可以利用以下技术。例如:
#include <iostrea>
using namespace std;
class Critter
{
public:
    Critter(int hunger = 0);
private:
    int m_Hunger;
};
Critter::Critter(int hunger):m_Hunger(hunger){}
   
    构造函数不需要显式调用,然而,在实例化新对象时,会自动调用构造函数。
   
    2.析构函数
    与构造函数对应的,还有一个在对象销毁之前被调用的函数,叫做析构函数。它主要用来执行必要的清理操作,如对堆中内存的清理。析构函数也有默认的空析构函数。
    析构函数由前置的~波浪号和类名组成。并没有参数或返回值。例如:
Critter::~Critter()
{
......
}


    3.拷贝构造函数
    对象有时候是被自动复制的。自动复制发生在:通过值传递给函数、从函数返回、通过初始式初始化另一个对象、作为唯一实参传递给对象的构造函数。
    默认的拷贝构造函数只是简单地将每个数据成员的值赋值给新对象中的同名数据成员,即按逐项进行复制。这会导致新的对象的某个堆内存中的成员变量指向堆中的同一个字符串。我们叫它浅拷贝。若要达到深拷贝的效果,必须在拷贝构造函数中创建新的内存地址。如下例所示:
Critter::Critter(const Critter& c)
{
    m_pName = new string(*(c.m_pName));
}


    4.内联函数
    调用内联函数会有较小的性能代价,因为函数内联让编译器将函数复制到其调用处。每次调用函数时,程序的控制权不必跳转到不同的位置。
    要将一个函数标记为内联函数,只需将inline置于函数定义之前。而函数生命中不适用inline。例如:
inline int radation(int health){cout << health;}
inline int Critter::Bored(int bored){cout <<bored;}

    将函数标记为内联函数时,编译器要决定是否将该函数内联。如果编译器认为内联不会提升效率,则不会对其进行内联。

    5.友元函数
    类的友元函数可以访问其任意成员而又不属于类的成员函数。指定函数为某个类的友元函数的方法是,在类定义中列出前面带有关键字friend的函数原型。例如:
class Critter
{
    friend void Peek();
private:
    int a;
}
void Peek()
{
    cout << Critter.a;
}


    6.运算符重载
    运算符重载可以为内置运算符定义新的意义,以便将它们用于自定义类型。例如,可以重载*运算符使其用在两个3D矩阵时计算它们的矩阵乘积。
    重载运算符的方法是,定义一个名为operatorX的函数,其中X是需要重载的运算符。例如:
ostream& operator<< (ostream& os, const Critter& aCritter)
{
    os << aCritter.m_Name;
    return os;
}

三、继承与多态
    C++中的继承,例如从Enemy类派生出Boss类,方法如下:
class Boss : public Enemy

    实际上,基类的一些成员函数并没有被派生类继承。它们是:构造函数、拷贝构造函数、析构函数、重载的赋值运算符。在派生类中必须自己编写这些函数。而另外要知道的是,在实例化派生类的对象时,自动调用基类的构造函数,但也可以从派生类的构造函数中显式地调用基类构造函数。析构函数也与其类似。

    当从一个类派生新类时,可以控制派生类访问基类成员的权限。例如上述代码中在Enemy前有一个public,说明成基类中的共有成员成为派生类中的共有成员,保护成员成为保护成员,私有成员成为私有成员。

    对于任何继承的积累成员函数,如果期望在派生类中对其进行重写,则应当使用关键字virtual将其声明为虚函数。在将一个成员函数声明为虚函数时,这位成员的重写版本提供了一种方法,使得成员函数能如预期那样用于对象的指针与引用。而在成员定义中不出现virtual关键字。一旦成员函数被声明为虚函数,它在任何派生类中都是虚函数。在重写一个虚成员函数时,不必再声明中使用关键字virtual。但提倡应当使用该关键字提醒我们这是一个虚函数。
分享到:
评论

相关推荐

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

    面向对象程序设计是软件开发中的一种重要方法,Java 语言是面向对象编程的代表之一,以其平台无关性、安全性和动态性等特性受到广泛使用。Java 期末复习中,掌握以下知识点至关重要: 1. **Java 语言的特点**: - ...

    Java面向对象程序设计试题一.doc

    在面向对象程序设计中,Java继承了C++的类概念,并引入了接口、抽象类等新特性,极大地丰富了面向对象的特性。为了掌握Java编程,理解其核心概念和特性至关重要,而这些正是Java面向对象程序设计试题所考察的重点。 ...

    Effective C++ 中文版

    6.继承与面向对象设计 条款32:确定你的public继承塑模出is-a关系 条款33:避免遮掩继承而来的名称 条款34:区分接口继承和实现继承 条款35:考虚virtual函数以外的其他选择 条款36:绝不重新定义继承而来的non...

    JAVA_基础入门教程

    - **Java语言特点**:Java是一种面向对象的编程语言,具有平台独立性、安全性高、易于移植等特点。 - **基本语法与概念**:在Java编程中,开发者需要掌握变量与数据类型的定义、运算符的使用、表达式的构建、语句的...

    2009年java课件第一章

    1. **面向对象**:Java是一种面向对象的编程语言,便于理解和实现复杂系统。 2. **互联网应用**:Java特别适合于Internet应用开发,广泛应用于网页服务、分布式系统和移动应用等领域。 3. **多线程**:Java内置的多...

    java 精选面试题及答案

    三、面向对象 1. 类与对象:类的定义、对象的创建与销毁。 2. 封装:通过访问修饰符控制成员变量的访问权限。 3. 继承:单继承与多重继承,super关键字的使用。 4. 多态:重写(Override)与重载(Overload),向上...

    Java基础教程.pdf

    - Java是一种面向对象的编程语言,设计初衷是为了实现“一次编写,到处运行”的理念。 - 它具有平台无关性、安全性、健壮性和可移植性等特点。 - **简单的Java程序**: - Java程序的基本结构包括类(Class)、主...

    java学习指南

    - **面向对象**:Java全面支持面向对象编程,包括封装、继承和多态,使得代码更加模块化、易于维护。 - **跨平台性**:Java的字节码架构确保了程序可以在任何安装了Java虚拟机(JVM)的平台上运行,无需重新编译。 -...

    JAVA基础阶段总结

    - **面向对象**:JAVA 是一种完全面向对象的语言,支持类、对象、继承、封装、多态等概念,极大地提升了软件开发的能力。 - **分布式**:JAVA 支持数据和操作分布在不同网络节点上的应用。这使得开发者可以构建出...

    中文版Thinking in Java 4th编程思想(笔记)

    《中文版Thinking in Java 4th编程思想》是学习Java编程的重要参考资料,它深入浅出地介绍了面向对象编程的核心概念。下面将详细解读其中的主要知识点。 1. **对象导论** - **万物皆对象**:Java编程的核心是对象...

    java程序设计之网络编程课后习题答案

    - Java是一种广泛使用的面向对象的编程语言,它的语法基于C++,但简化了许多特性。 - JDK(Java Development Kit)是Java开发环境的核心组件,包括了JRE(Java Runtime Environment)和开发工具。 - 安装JDK时,...

    武汉大学Java培训讲义

    - **面向对象**:Java是一种纯面向对象的语言,而C++支持多种编程范式。 - **内存管理**:Java自动管理内存,无需手动释放资源,而C++需要程序员显式管理内存。 - **语法差异**:Java取消了一些可能导致安全问题的...

    java学习笔记.pdf

    - **面向对象**:Java是一种纯粹的面向对象编程语言。 - **健壮性**:Java拥有强大的异常处理机制和垃圾回收机制,能够有效避免程序崩溃。 - **安全性**:Java提供了多种安全机制来防止恶意代码的攻击。 - **...

    JAVA发展历程

    Java 是一种纯粹的面向对象编程语言,所有的数据和行为都被封装在类中。这种严格的面向对象特性使得 Java 程序结构清晰,易于维护和扩展。 **2.4 安全性** 安全性是 Java 设计时的一个核心原则。Java 通过多层安全...

    JAVA相关基础知识

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。它以其“一次编写,到处运行”的特性而闻名,因为Java代码可以跨平台执行,只需在不同的操作系统上安装Java虚拟机...

    C++ Annotations V9.6

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

    面试Java程序员最可能遇到的问题考试大全

    1. **面向对象的特征**:封装、继承、多态。 2. **String是否是基本数据类型**:不是,String是对象,属于引用类型。 3. **int和Integer的区别**:int是原始数据类型,Integer是其对应的包装类,Integer对象在内存中...

    JAVA项目暗箱和改写项目的图片

    1. **Java编程语言**:Java是一种广泛使用的面向对象的编程语言,具有跨平台、安全性强、性能稳定等特性。在Java项目中,开发者通常会利用类、接口、继承、多态等面向对象概念来设计和实现业务逻辑。Java还提供了...

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

    Java程序设计与开发是计算机科学领域的一个重要主题,尤其对于初学者和有志于成为专业软件开发者的人来说,Java语言因其跨平台、面向对象的特点而备受推崇。本资源"Java程序设计与开发[张晓龙]"是由专家张晓龙编写的...

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

    Java程序设计语言是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)在1995年发布。它的设计目标是简洁、通用、高效和平台无关性,使得编写一次,到处运行(Write Once, ...

Global site tag (gtag.js) - Google Analytics