C++ 构造函数总结

31 篇文章 10 订阅

C++提供了构造函数来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,构造函数不需要用户来调用它,而是建立对象时自动执行。
构造函数的名字必须与类名相同,构造函数不具有任何类型,不返回任何值**(与void类型不同,不是返回空,而是没有返回值)**。

1.无参数的构造函数

#include <iostream>
using namespace std;

class Time
{
public :
	Time()
	{
		hour = 0;
		minute = 0;
		sec = 0;
	}
	void showtime();
private:
	int hour;
	int minute;
	int sec;
};
void Time::showtime()
{
	cout<<"hour:"<<hour<<"min:"<<minute<<"sec:"<<sec<<endl;
}
 int main()
 {
 Time time;
 time.showtime();
 getchar();
 return 0; 
 }

由上述程序可以看到:
1.在类中定义了构造函数,函数的名字与类名时相同的,并利用这个构造函数对对象中的数据初始化。
2.**那么程序在哪里调用了构造函数?**在26行,实例化了一个类的对象,代码在执行26行时完成7-12行的内容。
3.构造函数除了可以定义在类内,还可以定义在类外,注意要先在类内声明,如下:

#include <iostream>
using namespace std;

class Time
{
public :
	Time();
	void showtime();
private:
	int hour;
	int minute;
	int sec;
};
void Time::showtime()
{
	cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
Time::Time()
{
	hour = 0;
	minute = 0;
	sec = 0;
}
 int main()
 {
 Time time;
 time.showtime();
 getchar();
 return 0;
 }

代码中第7行为声明,第18-23行为构造函数的定义。

运行结果:
hour:0
minute:0
sec:0

2.带参数的构造函数

带参数的构造函数可以在实例化的时候传入不同的参数,让不同的对象具有不同的初值。

#include <iostream>
using namespace std;

class Time
{
public :
	Time(int,int,int);
	void showtime();
private:
	int hour;
	int minute;
	int sec;
};
void Time::showtime()
{
	cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
Time::Time(int h,int m,int s)
{
	hour = h;
	minute = m;
	sec = s;
}
 int main()
 {
 Time time(1,2,3);
 time.showtime();
 getchar();
 return 0;
 }

相比于上一个程序,只需要修改一部分就可以完成带参数的构造函数声明与定义:在7行的声明中带参数,在18-23行的定义中对类中的变量根据形参赋值,在26行的实例化中传入实参。

运行结果:
hour:1
minute:2
sec:3

3.构造函数的重载

在一个类中可以定义多个构造函数,以便为对象提供不同的初始化方法,供用户选择。这些构造函数具有相同的名字,而参数的个数或参数的类型不同。这称为构造函数的重载。

#include <iostream>
using namespace std;

class Time
{
public :
	Time();
	Time(int,int,int);
	void showtime();
private:
	int hour;
	int minute;
	int sec;
};
void Time::showtime()
{
	cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
Time::Time()
{
	hour = 0;
	minute = 0;
	sec = 0;
}
Time::Time(int h,int m,int s)
{
	hour = h;
	minute = m;
	sec = s;
}
 int main()
 {
 Time time1(1,2,3);
 time1.showtime();
 Time  time2;
 time2.showtime();
 getchar();
 return 0;
 }

以上代码只是将1,2组合,在8,9行声明了两个构造函数,它们的名字时相同的**(就是类的名字,也没办法不相同啊,呵呵)**,在程序的19-24,25-30行定义函数。第33行代码调用带参数的构造函数,第35行调用无参数的构造函数,系统根据构造函数的参数的个数和类型确定调用哪个构造函数。

运行结果:
hour:1
minute:2
sec:3
hour:0
minute:0
sec:0

构造函数的默认值

构造函数中参数的值既可以通过实参传递,也可以指定某些值的默认值,即如果用户不指定实参值,编译系统就使用默认值。

#include <iostream>
using namespace std;

class Time
{
public :
	Time(int h =2,int m=2,int s=2);
	void showtime();
private:
	int hour;
	int minute;
	int sec;
};
void Time::showtime()
{
	cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
Time::Time(int h,int m,int s)
{
	hour = h;
	minute = m;
	sec = s;
}
 int main()
 {
 Time time1(1,2,3);
 time1.showtime();
 getchar();
 return 0;
 }

第7行声明带参数的构造函数时给参数赋初值,在18-23行定义构造函数时根据实参赋值,如果没有指定形参对应的实参,系统将采用默认值。

Time time1(1,2,3);运行结果:
hour:1
minute:2
sec:3

Time time1;运行结果:
hour:2
minute:2
sec:2

Time time1(1);运行结果:
hour:1
minute:2
sec:2

Time time1(3,3);运行结果:
hour:3
minute:3
sec:2

C++ 中的拷贝构造函数是一种特殊的构造函数,用于在创建一个对象时,以另一个对象作为参数来初始化它。拷贝构造函数的声明如下: ```cpp class MyClass { public: MyClass(const MyClass& other); }; ``` 其中,other 是要拷贝的对象的引用。拷贝构造函数通常用于以下几种情况: 1. 通过值传递对象时,会调用拷贝构造函数来创建一个新的对象。 2. 在函数返回一个对象时,会调用拷贝构造函数来创建一个副本。 3. 在一个对象初始化另一个对象时,会调用拷贝构造函数。 在 C 语言中,没有拷贝构造函数的概念,但可以通过自己实现一些函数来模拟拷贝构造函数的功能。例如: ```c typedef struct { int x; int y; } Point; void point_copy(Point* dest, const Point* src) { dest->x = src->x; dest->y = src->y; } Point point_create(int x, int y) { Point p; p.x = x; p.y = y; return p; } int main() { Point p1 = point_create(1, 2); Point p2; point_copy(&p2, &p1); return 0; } ``` 在这个示例中,我们定义了一个 Point 结构体,并通过 point_create() 函数来创建一个 Point 对象。我们还定义了一个 point_copy() 函数,用于将一个 Point 对象拷贝到另一个对象中。在 main() 函数中,我们通过调用 point_copy() 函数来拷贝 p1 对象到 p2 对象中。 需要注意的是,在 C 语言中,拷贝构造函数的实现需要自己手动编写,而且需要特别注意内存管理,避免出现内存泄漏等问题。在 C++ 中,拷贝构造函数由编译器自动生成,可以方便地实现对象的拷贝。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值