当前位置: 首页 > article >正文

C++ 类和对象----构造函数

一、构造函数

概念:

在平时初始化,都要调用Init公有方法来初始化,调用比较频繁,因此,构造函数就是在对象创建时,就将信息设置进去。

 没有构造函数前:

#include<iostream>
using namespace std;

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year<<"-"<<_month<<"-"<<_day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Init(2024, 1, 21);
	d1.print();
	return 0;
}

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次

 构造函数后:

class Date
{
public:
	Date(int year, int month, int day)
	{
		_year = year;
        _month = month;
        _day = day;
	}
	void print()
	{
		cout << _year<<"-"<<_month<<"-"<<_day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2024, 1, 21);

	d1.print();
	return 0;
}

构造函数特性:

构造函数是特殊的成员函数,构造函数虽然名称叫构造,但是构造函数的主要任
务并不是开空间创建对象,而是初始化对象。
 

1.函数名与类名相同

2.无返回值

3.对象实例化时编译器自动调用对应的构造函数

4.构造函数可以重载
 

class Date
{
public:
	// 1.无参构造函数
	Date()
	{}
	// 2.带参构造函数
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year<<"-"<<_month<<"-"<<_day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int  main()
{
	Date d1; // 调用无参构造函数,// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
	d1.print();
	Date d2(2015, 1, 1); // 调用带参的构造函数
	d2.print();

	 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象
	 warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)
	Date d3();
	

	return 0;
}

注意:再次强调无参的构造函数是不用加()的,加上()就是函数的调用了

5、如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦
用户显式定义编译器将不再生成

(1)、没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数

#include<iostream>

using namespace std;


class Date
{
public:
	
   	如果用户显式定义了全缺省构造函数,编译器将不再生成
	//Date(int year=2024, int month=1, int day=26)
	//{
	//_year = year;
	//_month = month;
	//_day = day;
	//}
	
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	// 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数

	Date d1;
	d1.Print();
	return 0;
}

(2)、用户显式定义编译器将不再生成

#include<iostream>

using namespace std;


class Date
{
public:
	
	//如果用户显式定义了全缺省构造函数,编译器将不再生成
	Date(int year=2024, int month=1, int day=26)
	{
	_year = year;
	_month = month;
	_day = day;
	}
	
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	// 将Date类中全缺省构造函数放开	
	Date d1;
	d1.Print();
	return 0;
}

6、C++编译器在编译器生成的默认构造函数对内置类型,依旧是随机值,不做什么改变,但是对自定义类型,会调用它的默认成员函数

内置类型/基本类型 :int/char/double/指针  语言自身定义的类型

自定义类型 :struct/class/union

#include<iostream>

using namespace std;


class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
private:
	// 基本类型(内置类型)
	int _year;
	int _month;
	int _day;
	// 自定义类型
	Time _t;
};
int main()
{
	Date d;
	return 0;
}

可以看到,对自定义类型,会先调用它的默认成员函数

对内置类型不做处理,感觉很鸡肋,因此C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。

#include<iostream>

using namespace std;


class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
private:
	// 基本类型(内置类型)
	int _year = 1970;
	int _month = 1;
	int _day = 1;
	// 自定义类型
	Time _t;
};
int main()
{
	Date d;
	return 0;
}


http://www.kler.cn/a/589330.html

相关文章:

  • 一个简单的RPC示例:服务端和客户端
  • 【算法day13】最长公共前缀
  • AI时代的软件测试该如何“破局”?
  • 【Qt】QWidget属性2
  • 【项目合集】基于ESP32的智能化妆柜
  • 【Azure 架构师学习笔记】- Azure Databricks (22) --Autoloader
  • 随笔小记-本人常用桌面应用(流程图-boardmix,截图-snipaste,文件比较-beyond compare,远程控制-向日葵,解压-360压缩)
  • 机试准备第18天
  • Python的类和对象(4)
  • 在Django模型中的Mysql安装
  • oracle 基础知识之 多表查询
  • JVM---Java 类生命周期与类加载机制
  • 电子电气架构 --- 智能电动汽车的品牌竞争转变
  • 【失败了】LazyGraphRAG利用本地ollama提供Embedding model服务和火山引擎的deepseek API构建本地知识库
  • 面试系列|蚂蚁金服技术面【3】
  • C语言内存函数讲解
  • 10-SDRAM控制器的设计—— signaltap 调试
  • iptables与firewall的区别,从不同的角度讲解
  • 基于金融产品深度学习推荐算法详解【附源码】
  • C++类:特殊的数据成员