清华大学c++课程学习记录

这篇博客详细记录了清华大学C++课程中关于构造函数的学习内容,涵盖了构造函数的基本概念、各种类型的例题,包括委托构造函数和复制构造函数的深入探讨,并通过实例解析了复制构造函数的调用过程。
摘要由CSDN通过智能技术生成

清华大学c++课程学习记录:4.4系列


#4.4.1构造函数的基本概念
#4.4.2构造函数例题(1)
#4.4.3构造函数例题(2)
#4.4.4委托构造函数
#4.4.5复制构造函数
#4.4.6.复制构造函数调用举例

4.4.1构造函数的基本概念

// 
构造函数:
	类中的特殊函数:
	用于描述初始化算法;

构造函数作用:
	在对象被创建时使用特定的值构造函数;
	将对象初始化为一个特定的初始状态;

  例如:
	希望在构建一个Clock类对象时,
	将初始时间设为 0:0:0,
	就可以通过构造函数来设置。

构造函数的形式:
	函数名与类名相同;
	不能定义返回值类型,也不能有return语句;
	可以有形式参数,也可以没有形式参数;
	可以是内联函数;
	可以重载;
	可以带默认参数值;

构造函数的调用时机:
	在对象创建时被自动调用
  例如:
	Clock muClock(0,0,0)

默认构造函数:
	调用时可以不需要实参的构造函数
		参数表为空的构造函数;
		全部参数都有默认值的构造函数;
	下面两个都是默认构造函数,
	如在类中同时出现,会产生编译错误:
		Clock();
		Clock( int newH = 0, int newM = 0,int newS = 0);

隐含生成的构造函数:
	如果程序中未定义构造函数,编译器将自动生成
	一个默认构造函数
		a.参数列表为空,不为数据成员设置初始值;
		b.如果类内定义了成员的初始值,则使用类内定义的初始值;
		c.如果没有类内成员的初始值,则以默认方式初始化;
		d.基本类型的数据默认初始化的值是不确定的;

" = default"
	如果程序中已定义构造函数,则默认情况下编辑器不再隐含生成
	默认构造函数,如果此时仍希望编辑器隐含生成默认构造函数,
	则可以使用" = default"。

  例:
	class Clock
	{
		public:
			Clock() = default;
			Clock( int newH, int newM,int newS );
		private:
			int hour, minute, second;
	};
// 
/*
	功能:构造函数概念:

*/

# include <iostream>
using namespace std;

int main()
{
	return 0;
}

/*
PPT:

构造函数:
	类中的特殊函数:
	用于描述初始化算法;

构造函数作用:
	在对象被创建时使用特定的值构造函数;
	将对象初始化为一个特定的初始状态;

  例如:
	希望在构建一个Clock类对象时,
	将初始时间设为 0:0:0,
	就可以通过构造函数来设置。

构造函数的形式:
	函数名与类名相同;
	不能定义返回值类型,也不能有return语句;
	可以有形式参数,也可以没有形式参数;
	可以是内联函数;
	可以重载;
	可以带默认参数值;

构造函数的调用时机:
	在对象创建时被自动调用
  例如:
	Clock muClock(0,0,0)

默认构造函数:
	调用时可以不需要实参的构造函数
		参数表为空的构造函数;
		全部参数都有默认值的构造函数;
	下面两个都是默认构造函数,
	如在类中同时出现,会产生编译错误:
		Clock();
		Clock( int newH = 0, int newM = 0,int newS = 0);

隐含生成的构造函数:
	如果程序中未定义构造函数,编译器将自动生成
	一个默认构造函数
		a.参数列表为空,不为数据成员设置初始值;
		b.如果类内定义了成员的初始值,则使用类内定义的初始值;
		c.如果没有类内成员的初始值,则以默认方式初始化;
		d.基本类型的数据默认初始化的值是不确定的;

" = default"
	如果程序中已定义构造函数,则默认情况下编辑器不再隐含生成
	默认构造函数,如果此时仍希望编辑器隐含生成默认构造函数,
	则可以使用" = default"。

  例:
	class Clock
	{
		public:
			Clock() = default;
			Clock( int newH, int newM,int newS );
		private:
			int hour, minute, second;
	};

*/

4.4.2构造函数例题(1)

//
/*
	功能:构造函数举例
*/
# include <iostream>
using namespace std;

class Clock
{
	public:
		Clock( int newH, int newM, int newS);	//构造函数
		void setTime( int newH, int newM, int newS);
		void showTime();
	private:
		int hour, minute, second;

};

//构造函数的实现
Clock::Clock(int newH, int newM, int newS):
	hour(newH), minute(newM), second(newS){}

//成员函数的实现

//主函数
int main()
{
	Clock c(0,0,0);
	c.showTime();
	return 0;
}
// /*
	功能:构造函数举例
*/
# include <iostream>
using namespace std;

class Clock
{
	public:
		Clock( int newH, int newM, int newS);	//构造函数
		void setTime( int newH, int newM, int newS);
		void showTime();
	private:
		int hour, minute, second;

};

//构造函数的实现
Clock::Clock(int newH, int newM, int newS):
	hour(newH), minute(newM), second(newS){}

//成员函数的实现
void Clock::setTime( int newH, int newM, int newS )
{
	hour = newH;
	minute = newM;
	second = newS;
	
}
void Clock::showTime()
{
	cout << hour << ":" << minute << ":" << second << endl;
}
//主函数
int main()
{
	Clock c(0,0,0);
	c.showTime();
	return 0;
}

4.4.3构造函数例题(2)

// 
/*
	功能:构造函数举例
*/
# include <iostream>
using namespace std;

class Clock		//	时钟类的定义
{
	public:		//	外部接口,公有成员函数
		Clock( int newH, int newM, int newS);	//	构造函数
		Clock();	//	默认构造函数
		void setTime( int newH, int newM, int newS);
		void showTime();
	private:		//	私有数据成员
		int hour, minute, second;

};

//时钟类成员函数的具体实现

//默认构造函数
Clock::Clock():hour(0),minute(0),second(0){ }

//构造函数的实现
Clock::Clock(int newH, int newM, int newS):
	hour(newH), minute(newM), second(newS){
}

//成员函数的实现
void Clock::setTime( int newH, int newM, int newS )
{
	hour = newH;
	minute = newM;
	second = newS;
	
}
void Clock::showTime()
{
	cout << hour << ":" << minute << ":" << second << endl;
}
//主函数
int main()
{
	//Clock c(0,0,0);	//	自动调用构造函数
	//c.showTime();

	Clock c(8,10,0);	//	调用有参数的构造函数
	Clock c2;	//	调用无参数的构造函数
	c.showTime();
	c2.showTime();
	return 0;
}

4.4.4委托构造函数

// 
/*
	功能:委托构造函数
*/

# include <iostream>
using namespace std;


int main()
{
	
	return 0;
}

/*
回顾:
	Clock类的两个构造函数:
		构造函数-
		Clock::Clock( int newH, int newM, int newS):
			hour(newH), minute(newM), second(newS){
		}
		默认构造函数-
		Clock::Clock: hour(0), minute(0), second(0){ }

委托构造函数:
	委托构造函数使用类的其他构造函数执行初始化过程
  例如:
	Clock::Clock( int newH, int newM, int newS):
		hour(newH), minute(newM), second(newS){
	}
	Clock::Clock():Clock( 0, 0, 0){ }

*/

4.4.5复制构造函数

//
复制构造函数定义:
	a.复制构造函数是种特殊的构造函数,其形参为本类的对象引用。
	作用是用一个已存在的对象去初始化同类型的新对象。
	b.
	class 类名 
	{
		public:
			类名(形参);// 构造函数
			类名(const 类名 &对象名);//复制构造函数	  
	};
	类名::类(const 类名 &对象名)	//复制构造函数的实现
	{ 函数体 }

复制构造函数被调用的三种情况:
	a.定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
	b.如果函数的形参是类的对象,调用函数时,将使用实参对象初始
	化形参对象,发生复制构造;
	c.如果函数的返回值是类的对象,函数执行完成返回主调函数是,
	将使用return语句中的对象初始化一个临时无名对象,传递给主
	调函数,此时发生复制构造;
		这种情况可以通过移动构造避免不必要的复制,

隐含的复制构造函数:
	a.如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成
	一个隐含的复制构造函数;
	b.这个构造函数执行的功能是:用初始值对象的每个数据成员,初始
	化将要建立的对象的对应数据成员;

" = delect"
	如果不希望对象被复制构造:
	c++98做法:将复制构造函数声明为private,并且不提供函数的实现;
	c++11做法:用"delect"指示编译器不生成默认复制构造函数;
		例:
		class Point
		{
			public:
				point( int xx=0, int yy=0){ x = xx; y = yy;}//构造函数,内联
				Point( const Point& p) =delect;//指示编译器不生成默认复制构造函数
			private:
				int x, y;//私有数据
		};
// 
/*
	功能:复制构造函数
*/

# include <iostream>
using namespace std;


int main()
{

	return 0;
}

/*

复制构造函数定义:
	a.复制构造函数是种特殊的构造函数,其形参为本类的对象引用。
	作用是用一个已存在的对象去初始化同类型的新对象。
	b.
	class 类名 
	{
		public:
			类名(形参);// 构造函数
			类名(const 类名 &对象名);//复制构造函数	  
	};
	类名::类(const 类名 &对象名)	//复制构造函数的实现
	{ 函数体 }

复制构造函数被调用的三种情况:
	a.定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
	b.如果函数的形参是类的对象,调用函数时,将使用实参对象初始
	化形参对象,发生复制构造;
	c.如果函数的返回值是类的对象,函数执行完成返回主调函数是,
	将使用return语句中的对象初始化一个临时无名对象,传递给主
	调函数,此时发生复制构造;
		这种情况可以通过移动构造避免不必要的复制,

隐含的复制构造函数:
	a.如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成
	一个隐含的复制构造函数;
	b.这个构造函数执行的功能是:用初始值对象的每个数据成员,初始
	化将要建立的对象的对应数据成员;

" = delect"
	如果不希望对象被复制构造:
	c++98做法:将复制构造函数声明为private,并且不提供函数的实现;
	c++11做法:用"delect"指示编译器不生成默认复制构造函数;
		例:
		class Point
		{
			public:
				point( int xx=0, int yy=0){ x = xx; y = yy;}//构造函数,内联
				Point( const Point& p) =delect;//指示编译器不生成默认复制构造函数
			private:
				int x, y;//私有数据
		};

*/

4.4.6.复制构造函数调用举例

//
/*
	功能:复制构造函数调用举例
*/
# include <iostream>
using namespace std;

class Point
{
	public:
		Point( int xx=0, int yy=0){ x = xx; y = yy;}//构造函数,内联
		int getX() {return x;}
		Point( const Point& p);//=delect;//指示编译器不生成默认复制构造函数
	private:	//私有数据
		int x, y;
};

//成员函数实现
Point::Point( const Point & p)
{
	x = p.x;
	y = p.y;
	cout << "Calling the copy constructor" << endl;
}

//形参为Point类对象的函数
void fun1( Point p)
{
	cout << p.getX() << endl;
	//p.setX(1);
}

//返回值为Point类对象的函数
Point fun2()
{
	Point a;
	return a;
	
}

int main()
{
	Point a;	//第一个对象A
	Point b(a);		//情况一,用A初始化B。第一次调用拷贝构造函数
	cout << b.getX() << endl;
	fun1(b);		//情况二,对象B作为fun1的实参。第一次调用拷贝构造函数
	b = fun2();		//情况三,函数返回值是类对象,函数返回时,调用拷贝构造函数
	cout << b.getX() << endl;

	return 0;
}

本文只用于学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值