C++ 22.类与对象—对象特性—构造函数的分类及调用(拷贝构造函数调用时机、构造函数调用规则)

C++ 22.类与对象—对象特性—构造函数的分类及调用(拷贝构造函数调用时机、构造函数调用规则),第1张

C++ 22.类与对象—对象特性—构造函数的分类及调用(拷贝构造函数调用时机、构造函数调用规则)

构造函数分类方式

构造函数三种调用方式

拷贝构造函数调用时机

默认情况下,c++编译器至少给一个类添加3个函数

构造函数调用规则


构造函数分类方式

按参数分为:有参构造和无参构造(默认构造)
按类型分为:普通构造和无参构造

构造函数三种调用方式

1.括号法   2.显示法   3.隐式转换法

#include 
using namespace std;
class Person
{
public:
	Person()//无参构造
	{
		cout << "Person 无参构造函数的调用" << endl;
	}

	Person(int a)//有参构造
	{
		age = 10;
		cout << "Person 有参构造函数的调用" << endl;
	}

	Person( const Person &p)//拷贝构造,拷贝出一份一样的,引用的方式传递数据,加const限定它,防止将本体修改
	{
		//将传入的人身上的所有属性,拷贝到我身上
		cout << "Person 拷贝构造函数的调用" << endl;
		age = p.age;
	}
	
	int age;

	//2.析构函数
	~Person()
	{
		cout << "Person 析构函数的调用" << endl;
	}
};

//调用
void test01()
{
	//1.括号法 
	//Person p1;//默认构造函数
	//Person p2(10);//有参构造函数
	//Person p3(p2);//拷贝构造函数

	//注意事项1:调用默认构造函数时,不要加(),加上(),编译器会认为这是一个函数的声明,不会认为在创建对象

	//cout << "p2的年龄为:" << p2.age << endl;
	//cout << "p3的年龄为:" << p3.age << endl;

	//2.显示法 
	Person p1;//默认构造函数
	Person p2 = Person(10);//有参构造函数
	Person p3 = Person(p2);//拷贝构造函数

	//Person(10);//匿名对象  特点:当前行执行结束后,系统会立即回收掉匿名对象,然后执行其他代码
	//cout << "aaaaa" << endl;

	//注意事项2:不要利用拷贝构造函数 初始化匿名对象
	//Person(p3);//错误,编译器会认为Person(p3)===Person p3:对象声明

	//3.隐式转换法
	Person p4 = 10; //相当于 Person p4 = Person(10);  有参构造函数
	Person p5 = p4;//拷贝构造函数
}

int main()
{
	test01();
	system("pause");
	return 0;
}
拷贝构造函数调用时机

1.使用一个已经创建完毕的对象来初始化一个新对象
2.值传递的方式给函数参数传递
3.以值方式返回局部对象

#include 
using namespace std;
class Person
{
public:
	Person()//无参构造
	{
		cout << "Person 默认造函数的调用" << endl;
	}

	Person(int age)//有参构造
	{
		cout << "Person 有参构造函数的调用" << endl;
		m_age = age;
	}

	Person(const Person &p)//拷贝构造
	{
		cout << "Person 拷贝构造函数的调用" << endl;
		m_age = p.m_age;
	}
	int m_age;

	~Person()     //析构函数
	{
		cout << "Person 析构函数的调用" << endl;
	}
};

//1.使用一个已经创建完毕的对象来初始化一个新对象
void test01()
{
	Person p1(20);
	Person p2(p1);
	cout << "p2的年龄为:" << p2.m_age << endl;
}
//2.值传递的方式给函数参数传递
void doWork(Person p)
{

}
void test02()
{
	Person p;//值传递的方式,会临时拷贝一个副本,不会影响原本数据
	doWork(p);
}
//3.以值方式返回局部对象,局部对象在函数使用完后,会被释放掉
Person doWork2()
{
	Person p1;
	cout << (int*) & p1 << endl;
	return p1;
}
void test03()
{
	Person p = doWork2();
	cout << (int*)& p << endl;//p和p1不是同一个对象
}
int main()
{
	//test01();
	//test02();
	test03();
	system("pause");
	return 0;
}
默认情况下,c++编译器至少给一个类添加3个函数

1.默认构造函数(无参,函数体为空;也称空实现)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝

构造函数调用规则

1.用户定义有参构造函数时,c++不在提供默认无参构造,但是会提供默认拷贝构造
2.用户定义拷贝构造函数时,c++不会再提供其他构造函数

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713347.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存