Cpp学习——类与对象3

2023-11-19

 

目录

一,初始化列表

1.初始化列表的使用

 2.初始化列表的特点

3.必须要使用初始化列表的场景

 

  二,单参数构造函数的隐式类型转换

1.内置类型的隐式类型转换

2. 自定义类型的隐式类型转换

3.多参数构造函数的隐式类型转换

 4.当你不想要发生隐式类型转换时便可以使用explicit关键字。


一,初始化列表

1.初始化列表的使用

初始化列表是Cpp语法中新加的一个语法。作用是初始化类里面的一些成员。使用方式如下:

class Date
{
	Date()
		:_year(0)
		,_month(0)
		,_day(0)
	{

	}

private:
	int _year;
	int _month;
	int _day;
};

1.以冒号开始。

2.以逗号分割各个成员。

3.以括号里面放入相匹配的值来显示初始化成员。

执行初始化列表以后结果如下:

 

 2.初始化列表的特点

  1.初始化列表是成员定义的地方,不管有没有写初始化列表,成员都会被初始化。

  比如,当我把_month成员的初始化给屏蔽掉了以后:

class Date
{
public:
	Date()
		:_year(0)
		//,_month(0)
		,_day(0)
	{

	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date a1;
	return 0;
}

结果:

2. 初始化列表的执行顺序是按照声明的顺序来执行的。比如以下代码:

class A
{
public:
	A()
		:_a1(1)
		,_a2(_a1)
	{

	}
	void print()
	{
		cout << "_a1:"<<_a1 << endl;
		cout << "_a2:"<<_a2 << endl;
	}
private:
  int _a2;
  int _a1;

};

int main()
{
	A a1;
	a1.print();
	return 0;
}

这样的代码得出的结果会是什么呢?会是1,1吗?其实当然不会,这个程序得出来的结果其实是:随机值,1。

为神马会这样呢?其实这就跟初始化列表走初始化的顺序有关。想要让两个值都初始化为1。调用一下声明的顺序即可:

class A
{
public:
	A()
		:_a1(1)
		,_a2(_a1)
	{

	}
	void print()
	{
		cout << "_a1:"<<_a1 << endl;
		cout << "_a2:"<<_a2 << endl;
	}
private:
  int _a1;//调用顺序
  int _a2;

};

int main()
{
	A a1;
	a1.print();
	return 0;
}

 结果:

 3.若声明时给了缺省值,当初始化列表不显示传值的话初始化列表传入的值就是缺省值。若显式调用则为显式调用传入的值。如以下代码:

class A
{
public:
	A()
		:_a1(1)//显式调用
	{

	}
	void print()
	{
		cout << "_a1:"<<_a1 << endl;
		cout << "_a2:"<<_a2 << endl;
	}
private:
  int _a1=0;//给上缺省值
  int _a2=0;

};

int main()
{
	A a1;
	a1.print();
	return 0;
}

结果:

 

3.必须要使用初始化列表的场景

1.const成员声明以后要定义赋值时。

2.引用成员要定义赋值时。

3.没有默认构造函数的类对象初始化时。

 

  二,单参数构造函数的隐式类型转换

1.内置类型的隐式类型转换

在自定义类型中会发生隐式类型转换。转换的方式便是生成一个临时的对象,然后这个对象拷贝值再赋值给要初始化的对象。比如:

int main()
{
	double a = 1;//给double对象赋一个整型值
	int c = 1.00;//给一个int对象赋一个浮点数
	cout << "a:"<<a << endl;
	cout << "c:" << c << endl;
	return 0;
}

这个程序的结果会是什么呢?结果:

如何证明这里发生了隐式类型转换生成了临时对象呢?这里就得用到临时对象的一个特点了:临时对象具有常性。 所以当我们用非const引用对象来接收值时若为临时对象就一定会报错。如下列代码:

int main()
{
	double& a = 1;
	int& c = 1.00;
	cout << "a:"<<a << endl;
	cout << "c:" << c << endl;
	return 0;
}

结果:

 当我们加上const时程序便是正常运行的:

2. 自定义类型的隐式类型转换

既然内置类型有隐式类型转换,那自定义类型也得有隐式类型转换。不过,自定义类型要想有隐式类型转换那就得有一个带参的构造函数。如以下代码:

class B
{
public:
	B(int a )
	{
		_a1 = a;
	};

	void print()
	{
		cout << _a1 << endl;
	}

private:
	int _a1;
};

int main()
{
	B a = 1;//正常来说应该是B a(1)这样调用的。
	a.print();
	return 0;
}

结果:

正常打印 

为什么这样也行呢?其实这里便是发生了一个隐式类型转换。在上面代码中,1先调用构造函数把自己转化成了成一个临时的B类型的对象,再将1这个值传入到临时对象中。然后B a通过赋值调用默认生成的拷贝构造函数将临时对象里的值拷贝到a对象中。

3.多参数构造函数的隐式类型转换

多参数构造函数的隐式类型转换是在C++11之后才开始支持的新语法。原理与单参数的构造函数的隐式类型转换一样。但是使用方法不同。使用方法:

class B
{
public:
	B(int a ,int b,int c)
	{
		_a1 = a;
		_b1 = b;
		_c1= c;
		cout << "B(int)" << endl;
	};
	B(B& B1)
	{
		cout << "B(int&)" << endl;
	}
	void print()
	{
		cout << _a1 << endl;
		cout << _b1 << endl;
		cout << _c1 << endl;

	}

private:
	int _a1;
	int _b1;
	int _c1;
};

int main()
{
	B a = { 1,2,3 };//用花括号
	a.print();
	return 0;
}

结果:

 4.当你不想要发生隐式类型转换时便可以使用explicit关键字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cpp学习——类与对象3 的相关文章

随机推荐

  • Android修改Eclipse 中的Default debug keystore路径

    打开系统属性 gt 环境变量 gt 在 系统变量 那一个GroupBox下面选择 新建 gt 变量名为 ANDROID SDK HOME 注意 这个变量名不能改变 只能是这个名字 然后 把变量值改为你想把AVD所在的 android 文件夹
  • Ray Tracing in One Weekend01无法查看ppm的问题及一个C++字符缓冲传参引发的bug

    最近在学习光线追踪的经典教程 lt
  • AWS服务器,如何设置成密码登录

    公司一直有AWS服务器 但是每次启动的实例都是通过秘钥进行登录的 这里写个文章说明一下 如何将秘钥登录的服务器修改成密码登录 1 在新服务器中 创建root账户的密码 使用命令 sudo passwd root 按照步骤进行设置 2 设置完
  • 跨境独立站引流怎么做?必看的高转化教学

    熟悉跨境外贸的小伙伴应该清楚 不同于国内消费者习惯于在购物平台消费 国外买家大多喜欢登录品牌独立网站 独立站 进行购物 这也是许多跨境小伙伴入局独立站的原因之一 但是 即使你拥有一个精美的网站 如果没有足够的流量它也不会取得成功 因此 辛苦
  • 手把手实现语义分割项目

    手把手视频讲解 代码讲解 1 如何实现输入 完全免费解析直达 致力干货分享 2 如何实现模型 完全免费解析直达 致力干货分享 3 如何实现输出 完全免费解析直达 致力干货分享 截图如下 基础知识必备 Pytorch数据加载顺序 使用pyto
  • cf体验服老显示与服务器出现异常,穿越火线体验服出现网络异常

    我女神是taylor 回答数 4 被采纳数 133 2019 04 29 12 44 53 一天朋友求救说自己的机器无法运行游戏了 我询问具体情况 他刚买了一块赛扬 850 装上后DF3 DF1都不能玩了 二话没说拿起我的工具包就直奔现场
  • IT运维管理体系建设规划

    更多专业文档请访问 www itilzj com 公众号回复 218 获取高清pdf版本 福利 圈子构建 学习资料获取 1000 份重磅材料已分享 ITIL4 PPT教材 试题 视频 信息化 IT运维管理各类文档解决方案报告等 ITIL 培
  • HTML+CSS制作网页推广界面

    今天这个网页 其实用以前的基本方法也可以做出来 在这里主要是用到了CSS3的新特性font face以及fontawesome的应用 HTML部分 这一部分的主要框架如下图 黑色的div里面存放的是英文 h3和p标记存放的相应的文字 紫色的
  • 模型选择,深度学习常用定理,单层感知器实现多元输入一元输出的线性回归问题

    前言 这是补的昨天的学习内容总结 算下来有两天没更了 那两天 第一天我上午做了一上午实验 晚上开了一晚上的大创组会 收获也颇丰 第二天我码了一点代码 后来发现matlab有工具箱能直接预测 又试了下工具箱 因为内容较为简单 便没有写一篇总结
  • Linux终端连接工具-MobaXterm

    一 下载安装 1 下载地址 MobaXterm Xserver with SSH telnet RDP VNC and X11 Download 这里我下载的是左侧的免费版本 已经足够日志工作中查看日志了 二 基本操作 1 连接服务器 下载
  • GPIO引脚的模式设置:开漏、推挽、拉高、拉低、中断输入、串行通信、模拟输入输出、容错输入、PWM输出。过零检测介绍。

    开漏输出 软件 将GPIO口设置为开漏输出模式 可以实现开漏输出控制方式 输出电平只能被拉低 而不能被拉高 在使用开漏输出时 需要外部接上一个上拉电阻 将输出电平拉高到高电平 开漏输出常用于驱动I2C总线 LED灯等场景中 硬件设置为开漏输
  • a标签加入单击事件 屏蔽href跳转页面

    本文转载至 http blog 163 com huang qy blog static 615601452012101411625600 我们常用的在a标签中有点击事件 1 a href javascript js method 这是我们
  • Java 方法

    方法概述 方法 Method 是将具有独立功能的代码块组织成为一个整体 使其具有特殊功能的代码集 方法必须先创建才可以使用 该过程称为方法定义 方法创建后并不是直接运行的 需要手动使用后才执行 该过程称为方法调用 方法的定义和调用 格式 1
  • RAIN{INDIE} 自动寻路

    Unity游戏中有较多的自动寻路插件 看过几个 大同小异 而RAIN中的Behavior Tree感觉很好 听名字就知道很条理 下面 就用它做个简单的寻路小例子 首先 导入RAIN的包 结构如下 在使用的过程当中还会产生几个文件夹用来存放E
  • Go: 协程的生命周期管理

    协程的生命周期 1 定义 协程的创建等全部生命历程的管理 通俗的讲就是 保姆 它的作用是便于协程的回收利用 goroutine申请的代价很小 但是在go程序中 goroutine的总量是有上限 超过上限 多余出来的协程就得等到前面的协程完成
  • jszip 解压压缩包_一文彻底弄懂jszip中的压缩与解压

    最近在做一个类似离线包的需求 平时我们正常工作中是开发完成一个完整的SPA之后打包上线 由于我们暂时没有服务器的资源 所以目前采取的一个方案是把这个SPA打包为一个zip包 然后上传至CDN 别人用的时候直接从CDN拉包然后解压就可以了 这
  • equals,contentEquals

    直接看源码 还是挺好看的
  • docker配置nginx并绑定域名和映射网站目录

    1 拉取nginx镜像 docker pull nginx 2 映射docker中nginx容器html目录到服务器html配置目录 docker run name my nginx d p 80 80 v data nginx html
  • pip镜像源大全及配置

    在中国使用pip时 可以配置国内镜像源来提高安装速度和稳定性 以下是一些常见的国内镜像源 阿里云 https mirrors aliyun com pypi simple 清华大学 https pypi tuna tsinghua edu
  • Cpp学习——类与对象3

    目录 一 初始化列表 1 初始化列表的使用 2 初始化列表的特点 3 必须要使用初始化列表的场景 二 单参数构造函数的隐式类型转换 1 内置类型的隐式类型转换 2 自定义类型的隐式类型转换 3 多参数构造函数的隐式类型转换 4 当你不想要发