C++ 构造函数重载
构造函数是一个类的成员函数,用于初始化该类的对象。构造函数没有返回类型,并在对象创建时自动调用。
构造函数的特点
- 构造函数的名称与类名相同
- 构造函数没有返回类型
- 在对象创建时自动调用
- 始终位于类的公共范围内
- 如果没有创建构造函数,则会自动创建默认构造函数并将数据成员初始化为零
- 构造函数的声明名称区分大小写
- 构造函数不会隐式继承
构造函数的类型
构造函数有三种类型 –
- 默认构造函数 – 默认构造函数没有函数参数。它用于将数据成员初始化为一个值。默认构造函数在对象创建时被调用。
代码
#include
using namespace std;
class construct // create a class construct
{
public:
int a, b; // initialise two data members
construct() // this is how default constructor is created
{
// We can also assign both values to zero
a = 10; // intialise a with some value
b = 20; // initialise b with some value
}
};
int main()
{
construct c; // creating an object of construct calls defualt constructor
cout<< "a:" <
输出
a:10
b:20
- 参数化构造函数 – 一个非参数化构造函数没有构造函数参数,传入参数的值被初始化为其数据成员。参数化构造函数用于构造函数重载。
代码
#include
using namespace std;
class Point // create point class
{
private:
int x, y; // the two data members of class Point
public:
Point(int x1, int y1) // create paramterised Constructor and initialise data member
{
x = x1; // x1 is now intialised to x
y = y1; // y1 is now intialised to y
}
intgetX()
{
return x; // to get the value of x
}
intgetY()
{
return y; // to get the value of y
}
};
int main()
{
Point p1(10, 15); // created object for paramterised constructor
cout<< "p1.x = " << p1.getX() << ", p1.y = " << p1.getY(); // print x and y
return 0;
}
输出
p1.x = 10, p1.y = 15
解释
创建一个包含两个数据成员x和y的类point。创建一个带有参数x1和y1的参数化构造函数,并使用x1和y1给x和y赋值。在主函数中,我们使用值(10, 15)创建一个带有参数的构造函数。使用getter函数获取数据成员的值。
- 拷贝构造函数 – 拷贝构造函数通过同一类的另一个对象来初始化一个对象。
语法
class_name(constclassname &old_object)
代码
#include
using namespace std;
class Point // create point class
{
private:
int x, y; // data members of the class
public:
Point(int x1, int y1)
{
x = x1;
y = y1;
} // parameterised constructor
// Copy constructor
Point(const Point& p1) // initialisation according to syntax
{
x = p1.x;
y = p1.y;
}
intgetX() { return x; } // return value of x
intgetY() { return y; } // return valur of y
};
int main()
{
Point p1(10, 15); // call parameterised constructor
Point p2 = p1; // call Copy constructor
// use getter and setter to print x and y
cout<< "p1.x = " << p1.getX() << ", p1.y = " << p1.getY();
cout<< "\np2.x = " << p2.getX() << ", p2.y = " << p2.getY();
return 0;
}
输出
p1.x = 10, p1.y = 15
p2.x = 10, p2.y = 15
C++的构造函数重载
与函数重载的概念类似,构造函数也可以进行重载。当我们重载一个构造函数有多个目的时,称之为构造函数重载。
声明与类名相同,但由于它们是构造函数,所以没有返回类型。
构造函数重载的条件是参数的数量或类型不同。
代码
// C++ program to demonstrate constructor overloading
#include
using namespace std;
class Person { // create person class
private:
int age; // data member
public:
// 1. Constructor with no arguments
Person()
{
age = 20; // when object is created the age will be 20
}
// 2. Constructor with an argument
Person(int a)
{ // when parameterised Constructor is called with a value the
// age passed will be initialised
age = a;
}
intgetAge()
{ // getter to return the age
return age;
}
};
int main()
{
Person person1, person2(45); // called the object of person class in differnt way
cout<< "Person1 Age = " << person1.getAge() <
Person1 Age = 20
Person2 Age = 45
解释
在上面的程序中,我们创建了一个类 Person ,它有一个数据成员(年龄)。这个类中有两个构造函数,它们被重载了。我们通过提供一个参数并使其成为参数化构造函数来对第二个构造函数进行了重载。
因此,在主函数中创建对象person1时,它调用了非参数化构造函数;而创建person2时,它调用了参数化构造函数并执行了初始化年龄的必要操作。因此,当打印对象person1的年龄时,它会显示默认设置的20;而person2的年龄将显示传递给参数化构造函数的45。