构造函数
1.构造函数概述
1).构造函数的概念
构造函数是一种特殊的成员函数,其功能是在创建对象时,使用给定的值对对象进行初始化。
构造函数的特殊性质:
(1)构造函数与类同名,其访问控制属性为public。构造函数可以有一个或多个任意类型的参数。
(2)构造函数是特殊的内联函数。有隐含的返回值,该值由系统内部使用。用户不指定构造函数的返回值类型,甚至说明为void类型也不行。
(3)可以为一个类定义多个构造函数,它们以参数个数不同来区分。
(4)程序中不能直接调用构造函数,构造函数是在创建对象时由系统自动调用的。
2).构造函数的声明和定义
构造函数的声明和定义与普通成员函数的声明和定义类似。
#include <iostream>
using namespace std;
class complex
{
private:
double real,imag; //定义复数的实部和虚部
public:
complex(double r,double i) //定义构造函数,它的名字与类名相同
{
real=r; //初始化私有成员real和imag
imag=i;
}
void disp()
{
cout<<real<<"+"<<imag<<"i"<<endl;
}
};
int main()
{
complex opl(1.5,3.0);
opl.disp();
}
3).构造函数的参数
(1)构造函数可以不带参数的
(2)当构造函数带有参数时,在定义对象时必须给构造函数传递参数。否则,构造函数将不被执行。但在实际应用中,有些构造函数的参数值通常是不变的,只有在特殊情况下才需要改变它的值。这时,可以将构造函数定义成带默认参数的值的构造函数,这样,在定义对象时可以不指定参数,用默认参数值来初始化数据成员。
4).构造函数的重载
C++中支持函数的重载,所以一个类中也可以有多个不同参数形式的构造函数。即可以定义多个参数及参数类型不同的构造函数,用多种方法对对象初始化。对构造函数进行重载可以适应不同的情况,增加程序的灵活性,这些构造函数之间通过参数的个数或类型来区分。
#include<iostream>
using namespace std;
class point
{
private:
double fx,fy;
public:
point();
point(double x,double y);
void showpoint();
};
point::point()
{
fx=0.0;
fy=0.0;
}
point::point(double x,double y=5.5)
{
fx=x;
fy=y;
}
void point::showpoint()
{
cout<<fx<<" "<<fy<<endl;
}
int main()
{
point p1; //用构造函数point()创建对象
cout<<"the fx and fy of p1: ";
p1.showpoint();
point p2(10); //用构造函数point(double x,double y=5.5)创建对象
//fy用缺省值5.5初始化
cout<<"the fx and fy of p2: ";
p2.showpoint();
point p3(1.1,2.0); //用构造函数point(double x,double y=5.5)创建对象
//fy被重新赋值为2.0
cout<<"the fx and fy of p3: ";
p3.showpoint();
}
5).拷贝构造函数
C++中,除了普通的构造函数外,还有一类特殊的构造函数–拷贝构造函数。拷贝构造函数的作用是用一个已经存在的对象来初始化该类的新对象,用户可根据需要定义拷贝构造函数,也可由系统生成一个默认的拷贝构造函数。
(1)定义拷贝构造函数
由于拷贝构造函数是一种特殊的构造函数,因此其声明和定义与普通的构造函数有些区别。一般来说,自定义拷贝构造函数的形式为:
类名(类名&对象名)
{
拷贝构造函数的函数体;
}
其中,对象名是用来初始化另一个对象的引用。
(2)调用拷贝构造函数
一般来说,以下三种情况拷贝构造函数会被调用。
1.用类的对象去初始化该类的另一个对象时;
2.函数的形参是类的对象,调用函数进行形参和实参的结合时;
3.函数的返回值是类的对象,函数执行完返回调用者时。
(3)默认拷贝构造函数
当用一个已经存在的对象初始化本类的新对象时,如果没有自定义拷贝构造函数,则系统会自动生成一个默认的拷贝构造函数来完成初始化的工作。
注意:与拷贝构造函数的调用类似,默认的构造函数的调用也是由编译系统根据对象的特征自动调用的。
#include<iostream>
using namespace std;
class point
{
private:
double fx,fy;
public:
point(point &p); //声明拷贝构造函数
point(double x,double y); //声明构造函数
void showpoint();
};
point::point(point &p) //定义拷贝构造函数
{
fx=p.fx+10;
fy=p.fy+20;
}
point ::point(double x,double y) //定义构造函数
{
fx=x;
fy=y;
}
void point::showpoint()
{
cout<<fx<<" "<<fy<<endl;
}
int main()
{
point p1(1.1,2.2); //用构造函数创建对象p1
cout<<"the fx and fy of p1: ";
p1.showpoint();//1.1 2.2
point p2(p1); //用缺省拷贝构造函数创建对象p2
cout<<"the fx and fy of p2: ";
p2.showpoint();//11.1 22.2
}