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

【C++】类和对象(五)

1、初始化列表

作用:C++提供了初始化列表语法,用来初始化属性。

语法:

构造函数():属性1(值1),属性2(值2)...{}

示例:

#include<iostream>
using namespace std;
class   person
{
public:
	//传统的赋值
	person(int a, int b, int c)
	{
		m_a = a;
		m_b = b;
		m_c = c;
	}
	int m_a;
	int m_b;
	int m_c;
};
int main()
{
	person p(1, 2, 3);
	cout << "m_a=" << p.m_a << endl;
	cout << "m_b=" << p.m_b << endl;
	cout << "m_c=" << p.m_c << endl;
	return 0;
}

结果:

代码:

#include<iostream>
using namespace std;
class   person
{
public:
	//初始化列表初始化属性
	person():m_a(1),m_b(2),m_c(3){}
	int m_a;
	int m_b;
	int m_c;
};
int main()
{
	person p;
	cout << "m_a=" << p.m_a << endl;
	cout << "m_b=" << p.m_b << endl;
	cout << "m_c=" << p.m_c << endl;
	return 0;
}

结果:

由于这种代码的固定性,一般这样使用初始化列表

代码:

#include<iostream>
using namespace std;
class   person
{
public:
	//初始化列表初始化属性,意思是:m_a=a,m_b=b,m_c=c
	person(int a,int b,int c):m_a(a),m_b(b),m_c(c){}
	int m_a;
	int m_b;
	int m_c;
};
int main()
{
	person p(5,4,1);
	cout << "m_a=" << p.m_a << endl;
	cout << "m_b=" << p.m_b << endl;
	cout << "m_c=" << p.m_c << endl;
	return 0;
}

结果:

2、拷贝构造函数调用时机

C++中拷贝构造函数调用时机通常有三种情况:

(1)使用一个已经创建完毕当代对象来初始化一个新对象。

(2)值传递的方式给函数参数传值。

(3)以值方式返回局部对象。

示例://1、使用一个已经创建完毕的对象来初始化一个新对象

代码:

#include<iostream>
using  namespace std;
class person
{
public:
	person()
	{
		cout << "person默认构造函数调用" << endl;
	}
	~person()
	{
		cout << "person析构函数调用" << endl;
	}
	person(int age)
	{
		m_age = age;
		cout << "person有参构造函数调用" << endl;
	}
	person(const person& p)
	{
		m_age = p.m_age;
		cout << "person拷贝构造函数调用" << endl;
	}
	int m_age;
};
//1、使用一个已经创建完毕的对象来初始化一个新对象
void  test01()
{
	person p1(20);
	person p2(p1);
	cout << "p2的年龄为:" << p2.m_age << endl;
}
int main()
{
	test01();
	return 0;
}

结果:

示例://2、值传递的方式给函数参数传值

#include<iostream>
using  namespace std;
class person
{
public:
	person()
	{
		cout << "person默认构造函数调用" << endl;
	}
	~person()
	{
		cout << "person析构函数调用" << endl;
	}
	person(int age)
	{
		m_age = age;
		cout << "person有参构造函数调用" << endl;
	}
	person(const person& p)
	{
		m_age = p.m_age;
		cout << "person拷贝构造函数调用" << endl;
	}
	int m_age;
};
//2、值传递的方式给函数参数传值

void dowork(person p)
{

}
void test02()
{
	person p;
	dowork(p);
}
int main()
{
	test02();
	return 0;
}

结果:

示例://值方式返回局部对象

代码:

#include<iostream>
using  namespace std;
class person
{
public:
	person()
	{
		cout << "person默认构造函数调用" << endl;
	}
	~person()
	{
		cout << "person析构函数调用" << endl;
	}
	person(int age)
	{
		m_age = age;
		cout << "person有参构造函数调用" << endl;
	}
	person(const person& p)
	{
		m_age = p.m_age;
		cout << "person拷贝构造函数调用" << endl;
	}
	int m_age;
};
//值方式返回局部对象
person  dowork()
{
	person p1;
	
	return p1;
}
void test03()
{
	person p2= dowork();
	
}
int main()
{
	test03();
	return 0;
}

结果:

3、构造函数调用规则

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

(1)默认构造函数(无参,函数体为空)

(2)默认析构函数(无参,函数体为空)

(3)默认拷贝构造函数,对属性进行值拷贝。

构造函数调用规则如下:

(1)如果用户定义有参构造函数,C++不再提供默认无参构造函数,但是会提供默认拷贝构造函数。

(2)如果用户定义拷贝构造函数,C++不再提供其他构造函数。


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

相关文章:

  • Autosar-Os是怎么运行的?(多核系统运行)
  • 数据库的JOIN连接查询算法
  • 双指针(快速排序)
  • 【贪心算法】洛谷P1106 - 删数问题
  • 论文阅读的附录(七):Understanding Diffusion Models: A Unified Perspective(二):公式46的推导
  • 期权帮|如何利用股指期货进行对冲套利?
  • RBAC 权限控制 - 前端
  • GESP2024年3月认证C++六级( 第三部分编程题(2)好斗的牛)
  • python基础语法(3) -------- 学习笔记分享
  • 99.17 金融难点通俗解释:归母净利润
  • Day42:列表的组合
  • 图像加解密
  • Linux内核组成
  • 品牌RWA化构建指南:资产数字化与价值共创
  • 【云原生】【适用小白】SpringCloud Alibaba开源Nacos切换到MSE Nacos
  • Helm Chart 实现 Kubernetes 应用多环境部署实战
  • 【黑龙江乡镇界】面图层arcgis数据shp格式乡镇名称和编码wgs84无偏移内容测评
  • SpringCloud系列教程:微服务的未来(十七)监听Nacos配置变更、更新路由、实现动态路由
  • 十年筑梦,再创鲸彩!庆祝和鲸科技十周年
  • 论文阅读(二):理解概率图模型的两个要点:关于推理和学习的知识
  • 协助工具-任意门导航
  • 996引擎 - 前期准备-配置开发环境
  • 2025寒假训练——天梯赛训练(1)
  • 【代码随想录】第二、三章-链表、哈希表
  • PyQt5之QtDesigner的若干配置和使用
  • pyautogui操控Acrobat DC pro万能PDF转Word,不丢任何PDF格式样式