230 likes | 349 Views
手机移动设备嵌入式 C++. 第三章. 对 象. 目标. 类对象 构造函数 析构函数 拷贝构造函数. 类对象. 为了使用类,还必须说明类的对象。在定义类时,系统是不会给类分配存储空间的,只有定义类对象时才会给对象分配相应的内存空间。 对象的定义格式: < 类名 > < 对象名表 > ; 其中, < 类名 > 是待定的对象所属的类的名字,即所定义的对象是该类的对象。 < 对象名表 > 中可以有一个或多个对象名,多个对象名用逗号分隔。在 < 对象名 > 中,可以是一般的对象名,还可以是指向对象的指针名或引用名,也可以是对象数组名。. 对象成员.
E N D
手机移动设备嵌入式C++ 第三章 对 象
目标 • 类对象 • 构造函数 • 析构函数 • 拷贝构造函数
类对象 为了使用类,还必须说明类的对象。在定义类时,系统是不会给类分配存储空间的,只有定义类对象时才会给对象分配相应的内存空间。 对象的定义格式: <类名> <对象名表>; 其中,<类名>是待定的对象所属的类的名字,即所定义的对象是该类的对象。<对象名表>中可以有一个或多个对象名,多个对象名用逗号分隔。在<对象名>中,可以是一般的对象名,还可以是指向对象的指针名或引用名,也可以是对象数组名。
对象成员 对象成员的表示方法 一个对象的成员就是该对象的类所定义的成员。对象成员有数据成员和成员函数。一般对象的成员表示如下: <对象名>.<成员名> 或者 <对象名>.<成员名>(<参数表>) 前者用于表示数据成员,后者用于表示成员函数。这里的“.”是一个运算符,该运算符的功能是表示对象的成员。
示例 #include <iostream.h> class myclass { public: int data1; }; void main() { myclass object1; object1.data1 = 25; cout << "\n data1的值是" << object1.data1<<"\n"; }
对象指针成员 指向对象的指针的成员表示如下: <对象指针名>-><成员名> 或者 <对象指针名>-><成员名>(<参数表>) 同样,前者用于表示数据成员,后者用于表示成员函数。这里的“->”是一个表示成员的运算符,它与前面介绍过的“.”运算符的区别是:“->”用来表示指向对象的指针的成员,而“.”用来表示一般对象的成员。 对于数据成员和成员函数,以下两种表示方式是等价的: <对象指针名>-><成员名> 与 (*<对象指针名>).<成员名>
示例 #include <iostream.h> class myclass { public: int data1; }; void main() { myclass objact1; myclass *pObject1 = &objact1; pObject1->data1 = 25; cout << "\n data1的值是" <<pObject1->data1<<"\n"; }
构造函数 • 自动初始化对象的特殊的成员函数 • 与所属的类同名 • 可以在类中声明并定义构造函数,或在类中声明而在外部定义 • 构造函数没有返回类型 • 默认构造函数是不带任何参数的构造函数
示例1 class IMTI { public: IMTI(); //构造函数 }; IMTI() :: IMTI()() { }
示例2 class date{ int month, day, year; public: date()//默认构造函数 {day=1; month=1; year=1999;} date(int x)//仅指定日 {day=x; month=1; year=1999;} date(int x, int y, int z)//指定年月日 {day=x; month=y; year=z;} };
缺省构造函数 缺省构造函数是指不需要用户指定实参就能够被调用的构造函数,这并不意味着它不能接受实参。只意味着构造函数的每个参数都有一个缺省值与之关联。如: • Account::Account() { ... } • Stack::Stack( int size = 0 ) { ... } • Complex::Complex(double re=0.0,double im=0.0) { ... }
构造函数 编译器根据参数调用不同的构造函数 date now; date today(4); date all(23,3,1998);
析构函数 • 在对象销毁时自动调用的成员函数 • 编译器会生成对析构函数的调用 • 与类同名,但是在函数名前有个波浪号 (~) • 析构函数没有返回类型,也不带参数 • 一个类中只可能定义一个析构函数。
示例1 class imti { public: ~ imti(); //析构函数 }; IMTI() :: ~IMTI()() { }
示例2 #include<iostream.h> class Sample { public: Sample() {x = 0;} ~Sample() { cout<<"析构函数被调用!"<<endl; } int x; void Print() { cout<<"x = "<<x<<endl; } }; void main() { Sample s1; s1.Print(); s1.~Sample(); }
缺省析构函数 缺省析构函数的格式如下: • <类名>::~<缺省析构函数名>{ } • <缺省构析函数名>即为该类的类名。缺省析构函数是一个空函数
拷贝构造函数 在下列情况,会调用拷贝构造函数 • 将某个对象初始化为类的另一个对象时 • 将对象当作参数传递给函数时 • 函数返回对象时
拷贝构造函数 • 如果没有定义拷贝构造函数,编译器将自动生成一个 • 自动生成的拷贝构造函数只是将对象内容逐个字节地copy • 当数据成员有指针时,将导致两个对象的指针指向同一个地址
拷贝构造函数 定义 以对象的引用作为参数的构造函数 X::X(X &ptr) 或 X::X(const X &ptr) 使用 const 关键字,可以确保拷贝过程不会意外地更改源对象
示例1 #include<iostream.h> class TPoint { public: TPoint(int x, int y){ m_x = x; m_y = y;} TPoint(TPoint & p); ~TPoint(){cout<<"Destructor Called!\n";} int Xcoord() {return m_x;} int Ycoord() {return m_y;} private: int m_x, m_y; };
示例1(续) TPoint::TPoint(TPoint & p) { m_x = p. m_x; m_y = p. m_y; cout<<"Copy-initialization Constructor Called.\n,"; } void main() { TPoint p1(5, 7); TPoint p2(p1); cout<<"p2 = "<<p2.Xcoord()<<","<<p2.Ycoord()<<endl; }
示例2 #include<iostream.h> class TPoint { public: TPoint(int x, int y){ m_x = x; m_y = y; cout<<"now is beginning"<<endl; } TPoint(TPoint & p); ~TPoint(){cout<<"Destructor Called!\n";} int Xcoord() {return m_x;} int Ycoord() {return m_y;} private: int m_x, m_y; };
示例2(续) TPoint::TPoint(TPoint & p) { m_x = p. m_x; m_y = p. m_y; cout<<"Copy-initialization Constructor Called.\n,"; } TPoint F(TPoint q) { cout<<"ok\n"; int x, y; x = q.Xcoord() + 10; y = q.Ycoord() + 20; TPoint R(x, y); return R; } void main() { TPoint a(20, 35), b(0, 0); TPoint n(a); b=F(n); cout<<"b="<<b.Xcoord()<<","<<b.Ycoord()<<endl; }