构造函数析构函数带参数的构造函数默认参数的构造函数

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

对象p1:Construct is called! x= 0; y= 1 Destruct is called! 对象p2:Construct is called! x= 0; y= 1 Destruct is called!
Point::~Point() { //析构函数定义 cout<<"Destruct is called!" <<endl; } void fun(){ cout<<"对象p1:"; Point p1; p1.print(); } void main(){ fun(); cout<<"对象p2:"; Point p2; p2.print(); }
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
5. 构造函数的重载
一个类中可以具有几个构造函数,每个都去适合不同的场合, 这些构造函数靠所带的参数类型或个数的不同来区分,实际上是对 构造函数的重载。如下例: #include<iostream> using namespace std; class Point{ private: int x,y; public: Point(); //声明无参数的构造函数 Point(int vy); //声明带1个参数的构造函数 Point(int vx,int vy ); //声明带2个参数的构造函数 void print(){ cout<<"x= "<<x<<"; "<<"y= "<<y<<endl; } };
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎 #include<iostream> 对象p1 0 using namespace std; class Point{ 1 private: int x,y; Construct is called! public: x= 0; y= 1 Point();//构造函数声明 void print(){ cout<<"x= "<<x<<"; "<<"y= "<<y<<endl; } }; Point::Point() //构造函数定义 { x=0;y=1;cout<<"Construct is called!"<<endl; } void main(){ Point p1;//定义对象并自动调用构造函数 p1.print(); }
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
6. 类成员
类成员: 描述的是一个类内嵌其他类的对象作为 成员的情况,它们之间的关系是一种包 含与被包含的关系,常被称作组合关系。 当创建类的对象时,如果这个类具有内 嵌对象成员,那么各个内嵌对象也将被 自动创建。 在创建对象时,既要对本类的数据成员 进行初始化,又要对内嵌对象成员进行 初始化。
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎 类成员 class Circle{ Point centre; double radius; 4.3 public: Circle(double); 对象c ~Circle(){cout<<"析构圆:析构半径 "<<radius<<"\n";} void print(); }; Circle::Circle(double vr){ cout<<"\n构造圆:构造半径 "<<vr<<"\n"; radius=vr; } 构造点:10-12; void Circle::print(){ 构造圆:构造半径 4.3 centre.print(); 坐标:10-12 cout<<"半径="<<radius<<endl; 半径=4.3 } 析构圆:析构半径 4.3 void main(){ 析构点:10-12 Circle c(4.3); c.print(); } 10 20
对象p在定义过程中,没有传递参数,此时有两种可能:第一是在创建对象 时调用不带参数的构造函数Point()来对对象初始化;另一种是在创建对象时 调用带缺省参数的构造函数Point(int vx=2,int vy=2)来初始化对象。这两 种情况的存在使系统无法确定到底调用哪个构造函数,这就出现了二义性。 编译将不能通过。
C++程序设计 第四章 对象生灭 沈阳航空工业学院wenku.baidu.com李照奎
对象p1
0 0
对象p2
1 5
对象p3
10 10
Point::Point() { x=0;y=0; cout<<"Construct0 is called! "<<endl; } Point::Point(int vy) { x=1;y=vy; cout<<"Construct1 is called! "<<endl;} Point::Point(int vx,int vy) { x=vx ; y=vy; cout<<"Construct2 is called!"<<endl; } void main() Construct0 is called! { x= 0; y= 0 Point p1; p1.print(); Construct1 is called! Point p2(5); p2.print(); x= 1; y= 5 Point p3(10,10); p3.print(); Construct2 is called! }
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
对象p1
10 10
对象p2
0 0
对象p3
5 0
Point::Point(int vx,int vy) { x=vx ; y=vy; //用传递来的参数对私有变量x,y赋初值 cout<<"Construct is called!"<<endl; } Construct is called! void main(){ x= 10; y= 10 Construct is called! Point p1(10,10);//传两参数 x= 0; y= 0 p1.print(); Construct is called! Point p2; //不传参数取缺省值 x= 5; y= 0 p2.print(); Point p3(5); //传一个参数,第二个用缺省值 p3.print(); }
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
1. 构造函数 2. 析构函数 3. 带参数的构造函数 4. 默认参数的构造函数 5. 构造函数的重载 6. 类成员 7. 对象构造与析构的顺序
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
1. 构造函数
构造函数是一种用于创建对象的特殊的成员函数: 1)当创建对象时,系统自动调用构造函数,不能直接调用; 2)构造函数名与类名相同; 3)一个类可以拥有多个构造函数(重载); 4)构造函数可以有任意类型的参数,但不能具有返回类型。 构造函数的作用是: 为对象分配空间;对数据成员赋初值;请求其他资源。 如果一个类没有定义构造函数,编译器会自动生成一个不带参 数的默认构造函数,其格式如下: <类名>::<默认构造函数名>() { }//此构造函数只创建对象,不做初始化
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
#include<iostream> 对象p1 0 using namespace std; 1 class Point{ private: int x,y; 对象p2 0 public: Point();//构造函数声明 1 ~Point();//析构函数声明 void print(){ cout<<"x= "<<x<<";" <<"y= "<<y<<endl; } }; Point::Point() //构造函数定义 { x=0;y=1; cout<<"Construct is called!" <<endl; }
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
3. 带参数的构造函数
不带参数的构造函数,其对象的初始化是固定的。要想在建立 对象时,传递一定的数据来进行初始化就要引入带参数的构造 函数了。 如下例: #include<iostream> using namespace std; class Point{ private:int x,y; public: Point(int,int);//声明带参数的构造函数 void print(){ cout<<"x= "<<x<<"; "<<"y= "<<y<<endl; } };
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
对象p1
10 10
Point::Point(int vx, int vy){ x=vx ; y=vy; //用传递来的参数对私有变量x,y赋初值 cout<<"Construct is called!"<<endl; } void main(){ Point p1(10,10); //定义对象p1,并给构造函数传递实参 p1.print(); Construct is called! } x= 10; y= 10
Point::Point(){ x=0;y=0; cout<<"Construct0 is called! "<<endl; } Point::Point(int vx,int vy){ //用传递来的参数对私有变量x,y赋初值 x=vx ; y=vy; cout<<"Construct2 is called!"<<endl; } void main(){ Point p; p.print(); }
x= 10; y= 10
二义性
#include<iostream> using namespace std; class Point{ private: int x,y; public: Point(); //声明无参数的构造函数 //声明带2个参数的构造函数 Point(int vx=2,int vy=2 ); void print(){ cout<<"x= "<<x <<"; "<<"y= "<<y<<endl; } };
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
4. 默认参数的构造函数
在构造函数中允许指定函数参数的默认值,这些默认值在函数调用者不 确定参数时可以作为参数来使用。对于所有参数都定义了默认值的构造函 数,当它被调用时,允许改变传递参数的个数。如下例: #include<iostream> using namespace std; class Point{ private: int x,y; public: Point(int vx=0,int vy=0 );//声明缺省参数的构造函数 void print(){ cout<<"x= "<<x<<"; "<<"y= "<<y<<endl; } };
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
2. 析构函数
析构函数是一种用于销毁对象的特殊的成员函数: 1)当一个对象作用域结束时,系统自动调用析构函数; 2)析构函数名字为符号“~”加类名; 3)析构函数没有参数和返回值。 4)一个类中只能定义一个析构函数,析构函数不能重载。 析构函数的作用是进行清除对象,释放内存等。 如同默认构造函数一样,如果一个类没有定义析构函数,编 译器会自动生成一个默认析构函数,其格式如下: <类名>::~<默认析构函数名>() { } 默认析构函数是一个空函数。
C++程序设计 第四章 对象生灭 沈阳航空工业学院 李照奎
Circle的构造函数默认调用Point的无参构造函数
#include<iostream> using namespace std; class Point{ int x; int y; public: Point(); ~Point(){cout<<"析构点:"<<x<<"-"<<y<<endl;} void print(); }; Point::Point(){ x=10; y=12; cout<<"构造点:"<<10<<"-"<<12<<"; "; } void Point::print(){ cout<<"坐标:"<<x<<"-"<<y<<endl; }
相关文档
最新文档