类的成员、对象成员的引用
- 格式:doc
- 大小:15.00 KB
- 文档页数:3
什么是⾯向对象、对象是什么、什么是类、如何使⽤对象、类和对象的关系⾯向对象⼀、⾯向对象 概念:⾯向对象是⼀种编程思想,使⽤编程语⾔解决现实问题的⼀种思路。
分类: ⾯向过程: C 语⾔ ⾯向对象: Java ⾯向对象的思想: ⾯向对象的思想: ⾯向过程的思想:⾃顶向下 逐步执⾏。
---> 当解决⼀件事情的时候,⾸先想到的是我该怎么去做⾯向对象思想:以对象为中⼼,使⽤对象调⽤其功能。
---> 当解决⼀件事情的时候,⾸先想到的是我该让谁帮我做。
想到的谁 ---> 对象 对象:现实⽣活中存在的真实的事物都是对象,Java 中有⼀句名⾔: 万物皆对象,⼤到宇宙、⼩到夸克在Java 的世界中都可以看成对象。
提起对象,就需要提起另⼀个概念——类。
类是对象的模板,对象是类的实例。
⼆、类 概念: 将具有相同特征的⼀类事物的共性进⾏抽取(抽取的过程叫做抽象),形成的⼀个概念叫做类。
类的抽象: 1. 怎么去描述⼀个事物,从哪些维度进⾏描述? 这个事物具有什么 ---> 属性 这个事物会做什么 ---> ⾏为 2. 怎么去描述⼀类事物的共性? 这些事物具有什么 ---> 属性 这些事物会做什么 ---> ⾏为 类和对象的关系: 类是对象的模板 对象是类的实例 类的定义: 概述: 属性 : 使⽤成员变量来进⾏描述 ⾏为 : 使⽤成员⽅法进⾏描述 语法:关键词:class语法:public class 类名{} 成员变量 定义位置:类中⽅法外 语法: 数据类型 变量名; / 数据类型 变量名 = 初始值;作⽤域:⾄少在本类 默认值: 和数组元素的默认值是⼀样的 基本数据类型 整数类型 0 ⼩数类型 0.0 字符类型空字符 布尔类型 false 引⽤数据类型 null 定义的注意事项 1. 在同⼀个类中不能定义两个同名的成员变量 2. 在同⼀个类中成员变量可以和局部变量可以重名,但是在访问的时候,局部变量优先。
第三章类与对象§3—1 面向对象§3—2 类的定义§3—3 对象的定义§3—4 对象的初始化§3—5 特殊类§3—6 特殊对象§3—7 特殊成员§3—8复杂对象§3—9 类类型转换§3—10 友元§3—1 面向对象一.面向对象面向对象本质上是一种自然合理的思维方法,是一种通过模仿人类建立现实世界模型的习惯思维方式和表达方式,运用对象、类、封装、继承、消息、多态性等概念来构造系统的软件开发方法,它包含面向对象的分析、设计、编程、测试和维护等过程。
它从研究的客观事物出发,将它们抽象为系统中的对象,作为构成系统的基本单位,并尽可能隐蔽对象的内部细节,再把具有相同属性和服务的对象抽象为类。
从客观事物出发,经过不同层次上的抽象得到基类和它的派生类,派生类继承基类的属性和服务,实现了共享。
类中的大多数数据只能用本类的方法进行处理,类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。
向不同对象发送同一消息,可产生不同的行为二.面向对象的三大特性1.封装性:是基础是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节,只保留有限的对外接口使之与外部发生联系,其目的是有效地实现信息隐藏,它是软件设计模块化、软件复用、软件维护的基础对象和类是封装性的体现。
类是对若干对象的抽象描述,对象是它所属类的实例对象:是用来描述客观事物的一个实体,是问题域中客观事物的抽象表示,是用来构成系统的基本单位,由一组属性和行为构成对象属性:表示客观事物的静态特性,一般用数据表达对象行为:描述客观事物的动态特性,即事物的行为,一般用函数(方法)来表达类:是一种用户自定义的抽象数据类型,包含属性和服务两部分,它为该类的所有对象提供一种统一的抽象描述2.继承性:是关键派生类继承基类的属性和服务,派生类自身还有新的属性和服务继承机制既可避免公用代码的重复开发,减少代码和数据冗余,又可通过增强一致性来减少模块间的接口和界面继承有单继承和多继承,继承有传递性3.多态性:是补充即同一接口,多种方法;相同界面,多种实现指同一个名字对应着多种不同的行为或实现或不同对象收到相同的消息时,产生不同的行为多态性有两种:编译时的多态性:重载,包括函数和运算符重载运行时的多态性:动态联编,即同一属性或行为在基类及其各个派生类中具有不同的语义多态性使高层代码只写一次而在低层可多次复用,提高了程序设计的灵活性和效率三、基本术语1.抽象对一类具体事物共性的描述,即从一类事物中抽取共同的本质特点成为概念2.消息即成员函数的调用是向对象发出的服务请求,它包含提供服务的对象标识、服务标识以及输入信息和回答信息消息的接收者是提供服务的对象,它对外提供的每一种服务是按消息格式规定好的消息协议,该消息协议就是其服务的具体功能,即通过函数体来实现的一条完整的消息包含如下内容:①消息的接收者:对象标识②服务标识:函数名③符合消息协议要求的参数:函数实参表§3—2 类的定义一、类面向对象程序设计=对象+对象+对象对象=算法+数据结构类:是对某一类对象的抽象,它由概括了一组对象共同性质的数据和函数组成是一种用户自定义的抽象数据类型,它具有对数据的抽象性、隐藏性和封装性对象:是某一个类的实例,是对现实世界中真实对象的模拟现实世界是一个对象的世界,任何对象都具有一定的属性和操作,总能用数据结构与算法两者合一地来描述二、类的定义1.类的定义(1)说明部分用于类中成员作说明,告诉使用者“干什么”:①数据成员说明:对象的属性、状态、特征②成员函数说明:对象的行为、操作、服务、方法(2)实现部分用来实现成员函数,告诉使用者“怎么干”即提供成员函数的函数体2.具体定义格式:class 类名{public:成员函数和数据成员的说明或实现protected:成员函数和数据成员的说明或实现private:数据成员和成员函数的说明或实现};各个成员函数的实现说明:(1)类名:用户自定义的标识符,应有一定英文含义,类名本身就是类型名(2)类体:“{ }”括起来的部分,凡在其中实现的成员函数均为内联函数(3)访问权限修饰符:①public:公有访问属性,这种成员可以被任意函数访问(使用),提供类的接口功能②protected:保护访问属性,这种成员只能被本类的成员函数和友元函数以及派生类中的成员函数和友元函数访问(使用)③private:私有访问属性,这种成员只能被本类的成员函数和友元函数访问(使用)(4)当把私有成员的声明放于类体最前时,private可省略,即缺省(默认)访问权限为private(5)三种访问权限符在类体中的出现顺序可任意,也可出现多次或不出现(6)在类体中不允许对声明的数据成员进行初始化(7)在定义类的成员函数时,也可对形参设置默认值。
问题(知识点)描述:a.在C++的类的成员函数中,允许直接访问该类的对象的私有成员变量。
b.在类的成员函数中可以访问同类型实例的私有变量。
c.拷贝构造函数里,可以直接访问另外一个同类对象(引用)的私有成员。
d.类的成员函数可以直接访问作为其参数的同类型对象的私有成员。
举例描述上述知识:1).在拷贝构造函数中可以访问引用对象的私有变量:例如:class Point{public:Point(int xx=0,int yy=0){X=xx;Y=yy;}Point(Point &p);private:int X,Y;};Point::Point (Point &p){X=p.X;Y=p.Y;}2).在类的成员函数中可以访问同类型实例的私有变量class A{public:int getA() const { return a; }void setA(int val) { a = val; }void assign(A& _AA){this->a = _AA.a;_ AA.a = 10; //可以直接访问}void display(){cout<<"a:"<<a<<endl;}private:int a;};3).#include <iostream>using namespace std;class TestClass{public:TestClass(int amount){this->_amount = amount;}void UsePrivateMember(){cout<<"amount:"<<this->_amount<<endl;/*----------------------*/TestClass objTc(10);objTc._amount = 15; //访问同类型实例的私有变量cout<<objTc._amount<<endl;/*----------------------*/}private:int _amount;};int main(){TestClass tc(5);ePrivateMember();return(0);}关于该问题(知识点)的讨论和或解释:1.私有是为了实现“对外”的信息隐藏,或者说保护,在类自己内部,有必要禁止私有变量的直接访问吗?难道还要让我们声明一个类为自身的友元?Point::Point(Point &p){X=p.X; //这在Point类中的Point函数内,所以没错。
java基础-类的定义、成员变量、⽅法、对象的创建与使⽤⼀.JAVA类的定义 JAVA⾥⾯有class关键字定义⼀个类,后⾯加上⾃定义的类名即可。
如这⾥定义的person类,使⽤class person定义了⼀个person类,然后在person这个类的类体⾥⾯定义person这个类应该具有的成员变量(即属性)和⽅法,如这⾥定义的int id和int age这个两个成员变量,或者叫属性,这个id表⽰⼈的⾝份证号码,⼈应该具有这个属性,age表⽰⼈的年龄,这也是⼈应该具有的。
这样就在person这个类⾥⾯定义了两个⼈应该有的属性,接下来就是定义⽅法了,这⾥定义了三个⽅法,分别是getAge()、setAge(int i)和getId(),分别⽤来获取⼈的年龄,设置⼈的年龄,获取⼈的id,getAge()⽅法获取了⼈的年龄后,将获取到的值返回,所以使⽤了return age语句,getId()⽅法也使⽤了return id语句⽤于返回获取到的id的值。
⼆. 成员变量 在JAVA⾥⾯的任何变量⾸先应该要声明,然后再赋值,然后再使⽤。
成员变量和局部变量有⼀个重要区别:成员变量在类⾥⾯声明时如果不进⾏初始化,那么JAVA会默认给它初始化,⽽局部变量JAVA不会默认给它初始化,所以在⽅法⾥⾯声明⼀个局部变量如果不给它初始化时就会出错。
默认初始化⼤多数都是0,boolean类型的为false,引⽤类型的为null,如过不记得JAVA对成员变量默认的初始化是多少的话,那就这样做,定义⼀个成员变量,不给它初始化,然后直接打印这个成员变量,打印出来的结果就是JAVA默认的初始化的值。
三、Java⾯向对象的基本概念——引⽤ 引⽤类型和基本类型有着巨⼤的区别,当声明⼀个int i=0时,系统会马上给这个i分配⼀个内存空间(在栈内存⾥⾯分配⼀⼩块区域⽤来装数字0),⾥⾯装着⼀个值为0,以后使⽤i这个名字马上就可以访问这个内存空间⾥⾯的值,这就是基本数据类型,所以基础类型就只占⼀块内存。
游戏开发象目录 CONTENTS四.一类与对象零一四.二方法与属零二四.三构造函数与析构函数零三四.四封装零四零四四.五类地继承零五四.六多态六四.一 类与对象面向对象程序设计是一种计算机编程架构。
OOP地一条基本原则是计算机程序由单个能够起到子程序作用地单元或对象组合而成。
OOP达到了软件工程地三个主要目地:重用,灵活与扩展。
OOP=对象+类+继承+多态+消息,其核心概念是类与对象。
面向对象程序设计方法是尽可能模拟类地思维方式,使得软件地开发方法与过程尽可能接近类认识世界,解决现实问题地方法与过程,也即使得描述问题地问题空间与问题地解决方案空间在结构上尽可能一致,把客观世界地实体抽象为问题域地对象。
面向对象程序设计以对象为核心,该方法认为程序由一系列对象组成。
类是对现实世界地抽象,包括表示静态属地数据与对数据地操作,对象是类地实例化。
对象间通过消息传递相互通信,来模拟现实世界不同实体间地联系。
在面向对象地程序设计,对象是组成程序地基本模块。
四.一.一类与对象概述一.对象对象是现实世界事物存在地实体,如类,书桌,计算机,大楼等。
对象通常被划分为两部分,即动态部分与静态部分。
静态部分被称为"属",动态部分就是可以变化地行为。
如一个"",包括别,年龄等属,有哭泣,微笑等个具备地行为。
类通过探讨对象地属与观察对象地行为了解对象。
二.类类(Class)就是具有相同属与功能地对象地抽象集合。
C#程序地主要功能代码是在类实现地,类是C#语言地核心与基本构成模块。
使用C#编程就是编写自己地类来描述实际要解决地问题。
四.一.二类,方法与变量一.类地定义类地定义格式与结构定义地格式相似,在类定义需要使用关键字class,其语法格式如下: [类修饰符] class 类名{类地主体}说明:(一)C#有五种类修饰符,分别是:Public: 公有地, 是类型与类型成员地访问修饰符。
类和对象初步1.类的定义在定义外成员函数的实现2.类的成员函数之间可以相互调用,类的成员函数也可以重载,也可设默认参数值3.一般来讲,一个对象占用的内存空间的大小等于其成员变量的体积之和。
每个对象都有自己的存储空间(成员变量),但成员函数只有一份对象名.成员名指针->成员名引用名.成员名4.private:一个类的私有成员,只能在该类的成员函数中才能访问public:proteced:5.class默认private struct默认public6.内联成员函数:成员函数名前加inline 或函数体写在类定义内部的成员函数。
执行更快,但会带来额外的内存开销构造函数1.构造函数全局变量在堆上,系统自动初始化为零。
局部变量在栈上,初始值是随机的,需要初始化。
2.构造函数:对对象进行初始化。
构造函数执行时对象的内存空间已经分配,构造函数的作用是初始化这片空间.可重载,不写的话有默认构造函数,但是如果编写了构造函数,那默认构造函数不会再执行.是一类特殊的成员函数。
不写返回值类型,函数名为类名.3.对象在生成时一定会调用某个构造函数,一旦生成,不再执行构造函数.4.P183 Ctest *pArray[3]={new Ctest(4),new Ctest(1,2)}5.复制构造函数:其是构造函数的一种,只有一个参数,为本类的引用,防止混淆,构造函数不能以本类的对象作为唯一的参数。
默认复制构造函数。
6.复制构造函数被调用的三种情形:1用一个对象去初始化另一个对象时Complex C1(C2)ComplexC2=C1; 2 函数的参数是类A的对象。
形参未必等于实参函数中用对象的引用不会调用复制构造函数void Function(const Complex &c)3 函数的返回值是类A的对象7.类型转换构造函数:除复制构造函数外,只有一个参数的构造函数C=68.析构函数:在对象消亡时调用,可以定义其做善后工作。
第8章习题解答一. 选择题1. 关于类和对象,不正确的说法是()A. 类是一种数据类型,它封装了数据和函数B. 类是对某一类对象的抽象C. 可以基于类这种数据类型定义类的引用D. 一个类的对象只有一个【答案】D【解析】类是一种数据类型,可以基于“类”这种数据类型定义多个称为“对象”的变量。
2. 类定义的外部,可以被访问的类的成员有()A. public 的类成员B. public或private的类成员C. private或protected的类成员D. public或private 的类成员【答案】A【解析】类的成员数据或成员函数的访问属性分为三种情况:private、public和protected,即私有访问属性、公有访问属性和保护访问属性,类定义的外部只能访问公有访问属性的成员。
3 关于this 指针,说法错误的是()A. this指针必须显式说明B. 当创建一个对象后,this 指针就指向该对象C. 成员函数拥有this指针D. 静态成员函数拥有this指针【答案】D【解析】this指针是一种特殊的指针,它指向成员函数当前操作的数据所属的对象。
不同的对象调用相同的成员函数时,this指针将指向不同的对象,也就可以访问不同对象的成员数据。
而静态成员函数是一个类的所有对象共享的成员,而不仅仅是某一对象的成员。
因此,可以在没有任何对象存在的情况下,可以使用静态成员函数,而使用this指针必须有明确的对象所指。
4. 调用形式参数为普通对象的函数时,系统会自动调用相应类的()A. 名字不同于类名的一般成员函数B. 构造函数C. 析构函数D. 拷贝构造函数【答案】D【解析】若函数的形参为类的对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数实现拷贝赋值。
5. 定义某类的对象后,再删除该对象,系统会自动调用()A. 名字不同于类名的一般成员函数B. 拷贝构造函数C. 构造函数D. 析构函数【答案】D【解析】当对象生存期结束时,需要调用析构函数,释放对象所占的内存空间。
C++类中的六⼤默认成员函数详解在C++中,当你去创建⼀个类的时候,即便这个类是空类,也会⾃动⽣成下⾯6个默认成员函数,在本篇博客中,我将逐⼀分析下⾯6个默认成员函数。
构造函数构造函数并不是去构造函数的函数,⽽是去对函数进⾏初始化的函数。
构造函数的函数名与类名相同,当我们每次创建类对象的时候,就会⾃动调⽤构造函数。
构造函数在对象的⽣命周期中只会调⽤1次。
class Date{public://构造函数Date(int year = 2021, int month = 4, int day = 11){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};构造函数的⼏个特点:①函数名与类名相同②⽆返回值③对象实例化时编译器⾃动调⽤对应的构造函数④构造函数可以重载class Date{public://构造函数的重载://⽆参的构造函数Date(){}//需要传参的构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};⑤如果类中没有显式定义构造函数(就是⾃⼰没有去定义构造函数),那么编译器会⾃动⽣成⼀个⽆参的默认构造函数;如果类中显式定义了构造函数,那么编译器将不再⽣成,⽽是去使⽤⽤户定义的构造函数。
⑥默认构造函数只能同时存在1个。
默认构造函数分为以下3种:①⽆参的构造函数②全缺省的构造函数③编译器默认⽣成的构造函数默认构造函数的共同特点是:不⽤传参就可以调⽤class Date{public://下⾯2种和当你不写构造函数时编译器⾃动⽣成的默认构造函数只能同时存在1种//⽆参的Date(){_year = 2021;_month = 4;_day = 11;}//全缺省的Date(int year = 2021, int month = 4, int day = 11){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};⑦编译器⽣成的默认的构造函数,对内置类型(int, char, double...)不会做任何处理,但是会针对⾃定义类型的成员,调⽤它的构造函数去进⾏初始构造函数调⽤的2种写法:int main(){//⽆参时Date d;//单个参数Date(1);Date d1 = 2;//这种写法会发⽣隐式类型转换//多个参数Date(2021, 4, 11);Date d2 = {2021, 4, 11};//C++11中才⽀持的写法}构造函数与初始化列表初始化列表:以冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。
本讲基本要求
掌握:类成员函数的性质、定义及存贮方式。
对象成员三种引用方式,。
理解:类函数、作用域运算符、inline成员函数的概念。
重点、难点:类成员函数的性质、定义、存贮方式及引用;对象成员三种引用方式。
一、类的成员函数(成员数据、成员函数与全局函数)(成员函数的性质、定义)
1、成员函数的性质
1、类的成员函数(简称类函数)是函数的一种,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。
它可以被指定为private(私有的)、public(公用的)或protected(受保护的)。
2、在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。
成员函数可以访问本类中任何成
员(包括私有的和公用的),可以引用在本作用域中有效的数据。
3、一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。
4、类的成员函数是类体中十分重要的部分。
如果一个类中不包含成
员函数,就等同于C语言中的结构体了,体现不出类在面向对象程序设计中的作用。
2、在类外定义成员函数
前面看到的成员函数是在类体中定义的。
也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。
如:
class Student
{ public:
void display();员名(包含成员函数、成员数据)
说明:
1、“.”是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员。
2、不能只写成员名而忽略对象名,不应该这样写:num=1001;员名(包含成员函数、成员数据)
例如:
class Time
{ public://数据成员是公用的
int hour;
int minute;
};
Time t,*p //定义对象t和指向Time类的指引变量P
P=&T //使p指向对象t
cout<<P->hour;//输出P指向的对象中的成员hour
3、通过对象的引用来访问对象中的成员
如果为一个对象定义了一个引用,它们是共占同一段存储单元的,实际上它们是同—个对象,只是用不同的名字表示而已。
因此完全可以通过引用来访问对象中的成员,其概念和方法与通过对象名来引用对象中的成员是相同的。
例如:如果已声明了Time类,并有以下定义语句:
Time t1;//定义对象t1
Time &t2=t1;//定义Time类引用变量t2,并使之初始化为tl
cout<<;//输出对象t1中的成员hour
由于t2与t1共占同一段存储单元(即t2是tl的别名),因此t2.hour就是
t1.hour。
三、作业
1、 P67第二、三、四题。
2、实验四。