C++:关于构造函数

简介:        类属于一种用户自定义的数据类型,在声明一个对象的时候,编译程序要为对象分配存储空间,进行必要的初始化,这些工作是由构造函数来完成的.简单理解,构造函数就是用来对数据成员进行初始化的。
 

     类属于一种用户自定义的数据类型,在声明一个对象的时候,编译程序要为对象分配存储空间,进行必要的初始化,这些工作是由构造函数来完成的.简单理解,构造函数就是用来对数据成员进行初始化的。

      与构造函数相对应的是析构函数,它们之间的关系很像"new"和“delete”的关系,而且它们的声明和最后的销毁也是想new和delete那样对应的。析构函数用来收回存储空间,完成一些善后的工作.

 

构造函数使用的一些注意事项:

  1,构造函数名字必须与类名相同。

  2,构造函数不指定返回值,但有隐含返回值,就是说返回值这里可以先不用考虑。

  3,构造函数可以重载。

  4,调用构造函数对类对象初始化时,先执行初始化列表中的数据成员,再执行构造函数体中的内容。初始化列表中数  据成员的初始化顺序与类体中定义的顺序相同。

       尤其要注意的是第4条中初始化列表中数据成员的初始化顺序。


构造函数的示例

 

		#include<iostream>
		using namespace std;
		
		
		class Date   //定义一个日期类
		{
		public:
			Date(int y,int m,int d);    //带有3个参数的构造函数
		
			Date(int y=2000):year(y)    //默认的构造函数
			{
				month=10;
				day=1;
				cout<<"Constructor of Date with 1 parameter. "<<endl;
		
			}
		
			~Date(){cout<<"Destructor of Date:"<<year<<"."<<month<<"."<<day<<endl;}  //析构函数
		
			int IsLeapYear();   //判断闰年
		
			void Print(){cout<<year<<"."<<month<<"."<<day<<endl;}   //打印出年月日
		
		private:
			int year,month,day;
		};
		
		
		Date::Date(int y,int m,int d):year(y),month(m),day(d)   //带有3个参数的构造函数的定义
			 {
				 cout<<"Constructor of Date with 3 Parameters."<<endl;
			 }
		
		int Date::IsLeapYear()   //判断闰年的函数的定义
			 {
				 return (year%4==0 && year%100!=0) || (year%400==0);
			 }
		
		int main()   //主函数
		{
			Date date1(2002,10,1),date2;   //声明两个Date类型的变量,分别为date1,date2,其中date1调用带有3个参数的构造函数,date2调用默认的构造函数。
			
			cout<<"date1:";
			date1.Print();  //打印出date1的年月日
		
			cout<<"date2:";
			date2.Print();   //打印出date2的年月日
			
			//判断date2是否是闰年
			if(date2.IsLeapYear()) cout<<"date2 is a leapyear."<<endl; 
			else cout<<"date2 is not a leapyear."<<endl;
		
			return 0;
		}

结果:

 

      需要调用的是,构造函数的调用与析构函数相反,这两个东西看起来类似于VB中form_load和form_unload,但是 使用形式上更像进栈和出栈,先进后出,先调用构造函数的对象后被销毁。

在调用构造函数时,除了用传统的数据类型,比如int,double型数据进行对象的初始化外,还可以用一个已知的对象来初始化一个正在创建的同类对象,这种特殊的构造函数叫做复制的构造函数。

 

例如:


	#include<iostream>
	using namespace std;
	
	class Date  //定义一个Date类
	{
	public:
		Date(int y,int m,int d);     //3参数的构造函数
	
		Date(int y=2000):year(y)    //1个参数的构造函数
		{
			month=10;
			day=1;
			cout<<"constructor of date with 1 parameter."<<endl;
		}
	
		Date(const Date& d);   //复制的构造函数
	
		~Date(){cout<<"destructor of date:"<<year<<'.'<<month<<'.'<<day<<endl;}  //析构函数
	
		int IsLeapYear();  //判断闰年
	
		void Print(){cout<<year<<"."<<month<<"."<<day<<endl;}  //打印年月日
	
	private:
		int year,month,day;
	
	};
	
	Date::Date(int y,int m,int d):year(y),month(m),day(d) //3参数的构造函数定义
	{
		cout<<"constructor of date with 3 parameters."<<endl;
	} 
	
	Date::Date(const Date& d)    //复制的构造函数
	{
		year=d.year ;
		month=d.month ;
		day=d.day ;
		cout<<"copy constructor of date."<<endl;
	
	}
	
	int Date::IsLeapYear()  //判断闰年
	{
		return (year%4==0 && year%100!=0)||(year%400==0);
	}
	
	
	
	int main()
	{
		Date date1(2002,10,1);  //定义date1
		Date date2(date1);   //用date1来初始化date2
	
		cout<<"date1: ";
		date1.Print();
	
		cout<<"date2: ";
		date2.Print();
	
		return 0;
	
		
	}

结果:



  用对象来初始化对象本质上和用一般数据来初始化对象一样,因为对象很像是一种用户自定义的数据类型,它的使用和一般数据类型一样。


目录
相关文章
|
11天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
37 5
|
17天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
48 4
|
3月前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
77 30
|
2月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
20 1
|
2月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
21 0
|
2月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
21 0
|
4月前
|
编译器 C++
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:
|
6月前
|
安全 编译器 C++
C++一分钟之-构造函数与析构函数
【6月更文挑战第20天】C++中的构造函数初始化对象,析构函数负责资源清理。构造函数有默认、参数化和拷贝形式,需注意异常安全和成员初始化。析构确保资源释放,避免内存泄漏,要防止重复析构。示例代码展示了不同构造函数和析构函数的调用情况。掌握构造和析构是有效管理对象生命周期和资源的关键。
50 2
|
7月前
|
C++ Linux
|
5月前
|
编译器 C++
【C++】详解构造函数
【C++】详解构造函数