面向对象程序设计语言C++第04章 深入类与对象

合集下载

VC类与对象

VC类与对象

§1 类的定义
说明该类的所有成员。
成员函数用于对数据成员处理,又叫“方法”。类定义中的说 明部分一般只给出成员函数的原型声明,函数的定义放在类外。
类 作用域
函数返回类型 类名::成员函数名(形参表) { 函数体; }
成员函数 的定义
由于不同的类允许有相同名称的成员函数,因此,在类声明外定义成员函数的 实现时,必须在成员函数名前加上所属类名和作用域操作符“:: ‖。
对象的创建
对象是类的实例(instance),创建形式为:
类名 对象名列表;
对象可以是一般的对象名,也可以是指向对象的指针名或引用 名,也可以是数组。例如: #include "circle.h" #include<iostream.h> void main() { Circle circle1,circle2; Circle cir1=Circle(); //另一种创建对象的方式 … } #include "Time.h" #include<iostream.h> void main() { Time myClock, *pClock ; Time clock[3];//对象数组 Time &r=myClock; //引用 … }
类声明和类实现通常分别置 于两个文件中
类声明说明类所包含的成员(数据成员 及成员函数的原型说明),类实现给出 成员函数的定义,两者通常分别置于 两个文件中,文件名相同,扩展名不 同。类声明为头文件(扩展名.h),类 实现为源文件(扩展名.cpp)。 类声明部分存放在.h中,Date.h
class CDate { public: void Disp(); //显示年月日 void SetDate(int y,int m,int d); //设置年月日 void SetYear(int y); //设置年 void GetDate(int &y,int &m,int &d); //获取年月日 int GetYear(); //获取年 int isLeapYear(); //判断某年是否为闰年 private: int year,month,day; //数据成员,分别表示年月日 };

面向对象程序设计 - 深入类和对象 6

面向对象程序设计 - 深入类和对象 6

3/40
构造函数定义形式
构造函数(constructor)是与类同名的特殊成 员函数 其基本定义形式如下:
class X{ …… X(…); ; …… }
2010年6月24日星期四
4/40
示例(tdate1.h)
class TDate1 { public: TDate1(int y,int m,int d); //构造函数 ~TDate1(); //析构函数 void Print(); private: int year,month,day; }; TDate1::TDate1(int y,int m,int d) { year=y; month=m;
2010年6月24日星期四
2/40
1. 构造 析构函数 构造/析构函数
构造/析构函数功能
构造函数:在创建对象时,使用特定的值来将对 象初始化; 析构函数:用来释放对象,在对象删除前做一些 清理工作;
引用构造函数的原因
自动完成数据成员初始化,减少出错机率 自动完成释放对象的工作.
2010年6月24日星期四
2010年6月24日星期四 19/40
示例: 示例:析构函数的使用
用析构函数释放构造函数分配的自由存储空间
#include <iostream> using namespace std; class B{
private: int *a; char *pc; public: inline B(int x){ a=new int[10]; pc=new char; } inline ~B(){ delete []a; delete pc; }
}; void main() { B x(1); }
2010年6月24日星期四 20/40

面向对象编程技术第四章-文档资料

面向对象编程技术第四章-文档资料

说明:
关键字public后面声明公有类型成员 它们是类与外部的接口,任何外部函数都可以访问公有类 型数据和函数 关键字private后面声明私有类型成员
允许本类中的函数访问,类外部的任何函数都不能访问。 紧跟在类名称的后面声明私有成员,关键字private可省略 (不提 倡)
1.
2.
说明:
3.
保护类型与private类似,其差别表现在继承与派生时对派 生类的影响不同,在第七章介绍。
下页 例子
构造函数,后面介绍 class circle { public: circle::circle(int r) { radius=r; } int area() { return (int)3.14*radius*radius;
} void circle_prt() { cout<<"the private radius is:"<<radius<<endl; } void main() private: { int radius; circle circle1(1),circle2(3); };
3. 利用类易于编写大型复杂程序,其模块化程度比 C中采用函数更高。
慢慢体会…
2. 类的定义:
类是一种用户自定义类型,声明形式: class 类名 { public: 公有成员(外部接口) private: 私有成员 protected: 保护型成员 }
时钟类的成员 (数据成员与函数成员声明) class Clock 数据成员 {private: int Hour, Minute, Second; public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); };

c++面向对象知识点总结

c++面向对象知识点总结

c++面向对象知识点总结
1.类和对象:类是一种抽象数据类型,用于封装具有相似属性和操作的数据。

对象是类的实例化,具有自己的属性值和方法。

2. 继承:继承是指派生类从基类中继承属性和方法的过程。

派生类可以添加自己的属性和方法,或者重写基类的方法。

3. 多态性:多态性指的是一个对象可以具有多种形态,同一操作作用于不同的对象上会产生不同的效果。

多态性可以通过虚函数实现。

4. 抽象类与接口:抽象类是具有纯虚函数的类,不能直接实例化。

接口是类的一种特殊形式,只包含纯虚函数,用于定义一组操作。

5. 友元函数与友元类:友元函数是类的非成员函数,可以访问类的私有成员。

友元类是指一个类可以访问另一个类的私有成员。

6. 构造函数与析构函数:构造函数用于初始化对象的属性值,析构函数用于释放对象占用的空间和资源。

7. 运算符重载:运算符重载是指重新定义运算符的操作,以适用于用户自定义类型。

8. 异常处理:异常处理是指在程序执行过程中发生错误时,以一种可控的方式进行处理。

C++中使用try-catch语句进行异常处理。

9. 模板类与模板函数:模板类是指具有泛型参数的类,模板函数是指具有泛型参数的函数。

泛型参数使得类和函数可以适用于多种数据类型。

10. STL库:STL是C++标准库的一部分,包含了很多常用的数
据结构和算法,如容器、迭代器、算法等。

STL使得C++程序开发更高效和易于维护。

C语言程序设计基础-类与对象

C语言程序设计基础-类与对象
程序设计基础
类与对象
程序设计基础
基本概念
世界的万事万物都是由对象构成的!
有形的东西
无形的东西
程序设计基础
对象的两个方面: (1) 静态特征; (2) 动态行为;
例如: 张三今年28岁、男、未婚、176cm 这些称为对象的<属性attribute>。
例如: 张三可以吃饭、骑车、跳舞等。 这些称为对象的<操作operate>。
};
C c1; C c2("foo"); cout<<'\n'; } C*ptr=new C(); delete ptr; return 0;
}
程序设计基础
hort construct anony construct foo construct
foo destruct anony destruct anony construct anony destruct hort destruct
属性: 反映对象静态特征。
狗 重量 体长 叫 跑 操作: 反映对象动态行为。
程序设计基础
类:在C++中是如何用代码来定义的呢?
属性:
成员变量:
反映对象静态特征。
int m_weight; int m_length;
成员函数: void shout();
狗 重量 体长 叫

void run();
操作:
2、函数返回一个对象时,要使用返回值初始化一个隐藏对象, 调用拷贝初始化构造函数,该隐藏对象的生存期结束,同样调 用它的析构函数
#include <iostream.h> class Point{
Point::Point(Point &p)

C#中的类与对象

C#中的类与对象
来描述每个对象的行为。类成员的访问修饰符可以用以下关 键字之一来定义,
1.public:该类成员可以由任何代码访问。 2.private:该类成员只能由类中的代码访问,如果不加以 指明,则默认取值为private。 3.internal:该类成员只能由定义它的项目内部的代码访问。 4.protected:该类成员只能由该类或派生类中的代码访问。 类成员的访问修饰符的详细介绍参见4.5.1节。
public int Second;
public void DisplayTime()
{
Console.WriteLine(" now time is {0}:{1}:{2}"},Hour,Minute,Second);
}
//默认构造函数
public Time()
{
Hour=12;
Minute=30;
}
最新课件
6
4.1.2 对象的创建
类是一个静态概念,要想使用类,需要对类进行实例 化,即创建对象。
格式:
类名 对象名=new 构造函数;//new关键字用来创建对象。
说明: 1. new关键字用来创建对象,为对象在内存中分配空间, 创建对象的实体。 2. 构造函数名与类名相同,关于构造函数的介绍将在后 续章节进行,现在我们只需用类名后加上圆括号来代替。 如:Car car1=new Car();
最新课件
21
C#中析构函数是在适当的时候被资源回收器调用的, 不能保证一定会被调用,也不能保证其调用顺序, 析构函数也不能被外部程序显式调用。虽然在析构 函数中一般可以释放对象实例占用的重要资源,如 数据库连接等,但由于析构函数的调用是随机的, 没有任何保证,所以这些释放重要资源的工作最好 是存放在一个独立的成员函数中,由程序显式调用。

第4章 深入面向对象程序设计


class Person { private String name ; private int age ; void talk() { System.out.println("我是:"+name+",今年:"+age+"岁"); } public void setName(String str) { name = str ; } public void setAge(int a) { if(a>0) age = a ; } public String getName() { return name ; } public int getAge() { return age ; } } public class TestPersonDemo3-2 { public static void main(String[] args) { // 声明并实例化一Person对象p Person p = new Person() ; // 给p中的属性赋值 p.setName("张三") ; // 在这里将p对象中的年龄赋值为-25岁 p.setAge(-25) ; // 调用Person类中的talk()方法 p.talk() ; } }
class Person { private String name ; private int age ; void talk() { System.out.println("我是:"+name+",今年:"+age+"岁"); 我是: 我是 ,今年: 岁 } } public class TestPersonDemo3_1 { public static void main(String[] args) { // 声明并实例化一 声明并实例化一Person对象 对象p 对象 Person p = new Person() ; // 给p中的属性赋值 中的属性赋值 = "张三 ; 张三" 张三 // 在这里将 对象中的年龄赋值为 岁 在这里将p对象中的年龄赋值为 对象中的年龄赋值为-25岁 p.age = -25 ; // 调用 调用Person类中的 类中的talk()方法 类中的 方法 p.talk() ; } }

C#面向对象程序设计-正式版PPT课件

• class关键字前面是访问级别。在C#中,类的访问 级别由类的修饰符进行限定,类的修饰符如表5-1 所示。在上例中,如果类的修饰符为public,这表 示该类可以被任何其他类访问。类的名称位于 class关键字的后面。
-
14
2.2 类的声明
• 以上的类修饰符可以两个或多个组合起来使用,但需要注意下面几点: (1) 在一个类声明中,同一类修饰符不能多次出现,否则会出错。 (2) new类修饰符仅允许在嵌套类中表示类声明时使用,表明类中隐藏了
//香蕉类中其他的属性和方法 }
-
6
1.2 面向对象语言的特点
(2) 封装
• 类是属性和方法的集合,为了实现某项功能而定 义类后,开发人员并不需要了解类体内每行代码 的具体涵义,只需通过对象来调用类内某个属性 或方法即可实现某项功能,这就是类的封装。
• 封装提供了外界与对象进行交互的控制机制,设
计和实施者可以公开外界需要直接操作的属性和
• 例如:某个对象,其基类为“笔”,在调用它的“写”
方法时,程序会自动判断出它的具体类型,如果是毛
笔,则调用毛笔类对应的“写”方法,如果是铅笔,
则调用铅笔类对应的“写”方法。
-
9
2 定义类
• 在C#中,“类”是一种数据结构,它可以包含数据成员 (常量和字段)、函数成员(方法、属性、事件、索引器、
运算符、构造函数、析构函数)。
由基类中继承而来的、与基类中同名的成员。
(3) 在使用public、protected、internal和private这些类修饰符时,要注意这些类 修饰符不仅表示所定义类的访问特性,而且还表明类中成员声明中的访问特 性,并且它们的可用性也会对派生类造成影响。
(4) 抽象类修饰符abstract和密封类修饰符sealed都是受限类修饰符。

面向对象程序设计一 深入类与对象


深入类与对象——this指针
思考:希望能对Point加入一个行为:移动。
Point pt(3, 4); class Point { pt.MoveTo(5, 10); //其它同原类 pt.MoveTo(6, 12); public: void MoveTo(int newX, int newY) { m_iX = newX; m_iY = newY; cout << “Point move to” << newX << “,” << newY << endl; } 如果我们想这么调用呢: }; pt.MoveTo(5, 10).MoveTo(6, 12);
class Test { public: //Some Function; private: int m_iTestNum; static int sTestNum; }; Test t1; sizeof(t1)为多少呢?
结果为4
深入类与对象——static成员
类的Static成员函数 class Student { public: Student(); static int GetSeriNo(); private: static int seriNo; … };
深入类与对象——static成员
练习答案: Class Round { public: //其它同原Round类 static float GetPi(); static void SetPi(float _pi); private: //其它同原Round类 static float sPi; };
深入类与对象——Const成员
例2:考虑Round类中的这样一个方法
float Round::GetRadius() { return m_fRadius; } m_fRadius *= 2; return m_fRadius; m_fRadius *= 2; 非法操作 此方法的目的仅仅是 获取半径

C++实验报告-第四章-类与对象

C++实验报告实验4 类与对象一、实验目的1、掌握类的声明和使用2、掌握类的声明和对象的声明3、复习具有不同访问属性的成员的访问方式4、观察构造函数和析构函数的执行过程5、学习类的组合使用方法6、使用DEBUG调试功能观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序二、实验任务1、声明一个CPU类,包含等级rank、频率frequency、电压voltage等属性,有两个公有成员函数run、stop。

其中,rank为枚举类型CPU-Rank,声明为enum CPU-Rank{P1=1,P2,P3,P4,P5,P6,P7}, frequency为MHz的整数型,voltage为浮点型的电压值。

观察构造函数好析构函数的调用顺序。

2、声明一个简单的Computer类,有数据成员芯片cpu、存ram、光驱cdrom等,有两个公有成员函数run、stop。

cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,声明并实现这个类。

3、设计一个用于人事管理的People类。

考虑到通用性,这里只抽象出所有类型人员都具有的属性:number编号、sex性别、birthday出生日期、id号等。

其中出生日期声明为一个日期类嵌子对象。

用成员函数实现对人员信息的录入和显示。

要求包括:构造函数和析构函数、拷贝构造函数、嵌成员函数、组合。

三、实验容任务1:首先声明枚举类型,在这里出现了知识性错误,不清楚具体应如何声明,经查询相关书籍,知道应在类外进行声明。

初次用类来进行编程,在概念上是有一些混乱的,例如构造函数和析构函数的调用顺序等。

在用debug单步调试后,明白其中道理。

源程序://Lab4_1.cpp#include<iostream>using namespace std;enum CPU_Rank {P1=1,P2,P3,P4,P5,P6,P7};class CPU { //CPU类的定义private: //私有数据成员CPU_Rank rank;int frequency;float voltage;public: //外部接口CPU(CPU_Rank r,int f,float v) { //CPU类的构造函数rank=r;frequency=f;voltage=v;cout<<"构造了一个CPU!"<<endl;}~CPU() { //CPU类的析构函数cout<<"析构了一个CPU!"<<endl;}void run(){cout<<"CPU开始运行"<<endl;}void stop(){cout<<"CPU停止运行"<<endl;}};//主函数int main(){CPU a(P6,300,2.0); //建立CPU类的对象a.run();a.stop();return 0;}实验结果:从debug调试中可知,在创建类的对象时,首先调用其构造函数,之后,在其他成员函数调用结束后,对象的生存期结束,系统便自动调用析构函数,进行析构。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

31
第四章 深入类和对象 •4.6 友元关系
4.6.2 友元类
class Printer; class INTEGER { private: int num1; friend Printer; … };
类Printer的成员函数全都是类INTEGER的友元 函数; 可以访问类INTEGER的任何成员。
void main( ) { INT mainObj; mainObj.set(1); mainObj.out( ); mainObj.fun(mainObj); mainObj.out( ); } 则程序输出: 1 10 20 30 40 50 60 40
第四章 深入类和对象 • 4.5 对象和指针
一个对象的私有数据,只能通过成员函数进行 访问,这是一堵不透明的墙。 这种限制性的用法给两个类必须共享同一函数 的情形带来了较大的开销。 出于效率(而非技术上必须)考虑,C++提供 了一种辅助手段,允许外面的类或函数去访问一个 类的私有数据。
27
class INTEGER { private: int num; public: void Set(int n){ num=n;} }; void Print( INTEGER obj) { cout<<obj.num;} // 错误 why? void mian( ) { INTEGER INTobj; INTobj.set(100); Print(INTobj); …}
4.1.2 构造函数的定义 2)构造函数的初始化列表的方式
Date::Date(int y,int m,int d):year(y), month(m),day(d) {}
5
第四章 深入类和对象 • 4.1 构造函数
4.1.2 构造函数的定义 3. 缺省的构造函数 用户定义的类类型中,可以没有构造函数。 编译器会自动给该类类型生成一个没有参数的构 造函数,该函数不作任何初始化工作。 这种构造函数称为缺省的构造函数。 注意: 一个类如果有显式定义的构造函数,编译 器就不会生成缺省构造函数了。
17
第四章 深入类和对象 •4.5 对象和指针ቤተ መጻሕፍቲ ባይዱ
4.5.1 this指针 C++为所有非静态成员函数提供了一个称为this 的指针,因此,常常称成员函数拥有this指针。 this是一个隐含的指针,不能被显式声明 它只是一个形参,一个局部变量 在任何一个非静态成员函数里都存在 它局部于某一对象。 this指针是一个常指针,可以表示为(但不能显 式声明): X * const this;
(ex4-15.cpp)
19
class INT { int num; public: void set(int x) { num=x;} void out() {cout<<num<<„ ‟;}
void fun( INT obj) { INT funObj; num=10;obj.num=20; funObj.num=30; out( );obj.out( ); funObj.out(); set(40); obj.set(50); funObj.set(60); out( );obj.out( );funObj.out( );} }; //类定义结束
4.5.2 指向类对象的指针 在C++中,可以直接使用对象,也可通过指向对 象的指针变量来使用对象。 说明指向对象的指针变量的语法与说明指向其他 任何数据类型的指针变量的语法相同。 One_Class_Name * obj_pointer; 可以通过 指向对象的指针变量->类的公有成员 的方式在类外访问一个类的成员。(ex4-16.cpp)
23
第四章 深入类和对象 •4.5 对象和指针
4.5.3 指向类的成员的指针 C++语言中,可以说明指向类的数据成员的指 针和指向类的成员函数的指针。 这两种指针必须与对象或指向对象的指针结合 使用。
24
第四章 深入类和对象 • 4.5 对象和指针
4.5.3 指向类的成员的指针 1. 指向类的数据成员的指针 指向类的数据成员的指针定义格式为: 类型名 类名::*指针; 这种说明不是说指针是属于类的 而是说明指针只能指向指定类的指定类型的成员
class INTEGER { private: int num; public: void Set(int n){ num=n;} friend void Print(INTEGER ); }; void Print( INTEGER obj) { cout<<obj.num;} // ok void mian( ) { INTEGER INTobj; INTobj.set(100); Print(INTobj); …}
10
第四章 深入类和对象 •4.2 析构函数
可以使用完全限定名方式显式地调用析构函数; 若没有显式调用,则在一个对象的作用域结束时, 系统自动调用析构函数。 系统自动调用构造函数和自动调用析构函数的顺 序是相反的。
class X { public: X() { } ~X() { } }; (ex4-8.cpp)
4.1.2 构造函数的定义 1. 构造函数的定义
class Date { private: int year, month, day; public: Date(int y, int m, int d); … //其它成员 }; 构造函数的参数可以是缺省的。
3
第四章 深入类和对象 • 4.1 构造函数
(ex4-17.cpp)
25
第四章 深入类和对象 • 4.5 对象和指针
4.5.3 指向类的成员的指针 2. 指向类的成员函数的指针 指向类的成员函数的指针定义的格式为: 类型名 (类名::*指针)(参数表); 函数指针并不属于类, 而是只能指向类的指定原型的函数。(ex4-18.cpp)
26
第四章 深入类和对象 •4.6 友元关系
4.7.1 对象数组 可以像创建任何其他数据类型的数组一样的方式 来创建一个类的对象数组。 创建对象数组,每个数组元素都是一个对象,所 以需要多次调用构造函数;释放对象数组,也需要 多次调用析构函数。 One_Class_Name obj_array[10];
34
第四章 深入类和对象 •4.7 与类和对象相关的问题
全局对象: 在程序运行前,调用构造函数创建它们 整个程序结束时,调用析构函数释放它们
第四章 深入类和对象 • 4.4 对象的创建、释放和初始化
2. 对象的初始化 初始化有许多表示法,C++语言允许下述三种表 示方法。 ① C风格的初始值表的方法 ② 赋值表达式的方法 ③ 表达式表的方法
• • Class_Name Object(…); Class_Name Object = …;
面向对象程序设计语言C++
电子科技大学计算机学院
1
第四章 深入类和对象 • 4.1 构造函数
4.1.1 构造函数的作用 构造函数的作用为: (1) 分配一个对象的数据成员的存储空间; (该功能由系统自动完成。) (2) 执行构造函数(体),一般是初始化一个对象的 部分或全体数据成员。
2
第四章 深入类和对象 • 4.1 构造函数
第四章 深入类和对象 • 4.2 析构函数
与构造函数对应的是析构函数。C++通过析构函 数来处理对象的善后工作。 析构函数没有返回类型,没有参数,函数名是类 名前加“~”。 析构函数的作用为: (1) 执行析构函数(一般没有具体的工作); (2) 释放对象的存储空间。(该功能由系统自动 完成。) 注意:析构函数需要负责释放new申请的空间。
第四章 深入类和对象 •4.4 对象的创建、释放和初始化
1. 对象的创建和释放 可以创建不同形式的各类对象: ①命名的自动对象 每次进入该对象的作用域,都调用构造函数; 每次退出该对象的作用域,都调用析构函数。
13
第四章 深入类和对象 • 4.4 对象的创建、释放和初始化
class Table {…}; void f(int a) { Table aa; //aa的生命期到f函数返回 Table bb; //bb的生命期到f函数返回 if (a>0) { Table cc; //cc的生命期到if语句结束 … } Table dd; //dd的生命期到f函数返回 … }; //若调用函数f(10) 则调用构造函数的顺序是:aa、bb、cc、dd; 调用析构函数的顺序是:cc、dd、bb、aa。
4.7.1 对象数组 C++语言不允许初始化对象数组,所以,要创 建一个类的对象数组,该类的构造函数必须满足下 列三个条件之一: ①没有构造函数; ②有构造函数,但要有一个构造函数不带参数; ③有构造函数,但要有一个构造函数具有的参数全 是缺省参数。(ex4-22.cpp)
32
第四章 深入类和对象 •4.6 友元关系
4.6.3 友元关系的总结 友元具有如下的特性: 非传递性。即A是B的友元,B是C的友元,但A 不一定是C的友元(除非将A声明 为C的友元); 非对称性。即A是B的友元,但B不一定是A的 友元(除非将B声明为A的友元)。
33
第四章 深入类和对象 •4.7 与类和对象相关的问题
4.1.2 构造函数的定义 2. 构造函数的初始化方式 构造函数有两种方式初始化数据成员: 1)在构造函数体内用赋值语句的方式;
Date::Date(int y, int m, int d) { year = y; month = m; day = d; }
4
第四章 深入类和对象 •4.1 构造函数
class Date { int year, month, day; public: Date(int d, int m, int y); Date(int d, int m); Date(int d); Date(); Date(const char * dateStr); … };
相关文档
最新文档