C++面向对象——构造函数的初始化列表、类的各种成员方法及区别、指向类成员的指针

构造函数的初始化列表

这里定义一个商品类(CGoods),没有占有外部的资源。此时编译器为这个类产生的默认析构函数就可以了。编译器也可以为这个类产生的默认构造函数(不带参数的构造, 空函数:什么也不做)。但是现在我们提供了一个带3个参数的构造函数,编译器为这个类就不产生的默认构造函数了。类的成员方法一编译以后,会给所有的成员方法 参数 都加上一个this 指针 来接收调用这个方法的对象的地址。但是我们可以不用写这个。包括构造和析构函数里面也是有这个this指针的。

现在我们要给这个商品添加上一个生产日期:年月日。 若是作为这个商品类的属性 那么这个属性不通用。但其实这个年月日这个 是可以是可以通用到很多地方的,所以封装成类

这两个类都有了,怎么组建类间的关系呢?
CDate信息是 CGoods商品信息的一部分 a part of… 组合的关系 所以使用CDate 类定义的一个对象_date作为CGoods的成员变量,对象_date则被称作是成员对象

对象生成: 1.分配内存 2.调用构造函数。对象_date作为CGoods的成员变量,在给CGoods 的对象开辟内存的时候,对象_date的内存也是有的,但是它作为成员变量是要构造的。 在C++中,在定义一个对象却没有指定其构造方式的时候,会自动调用其默认构造函数(在CDate类里面自定义了一个构造函数,编译器就不会再产生默认构造了),但是我们没有指定任何_date的构造方式。因此报错。所以需要在CGoods的构造函数里面 更新 对象_date的构造函数。

那么这个年月日信息是如何传递给这个_date对象的呢?如何在CGoods里面 去指定_date 的构造方式的呢?掌握构造函数的初始化列表的作用:

CGoods(char* name, int amount, double price, int y, int m, int d)
:_date(y, m, d)//1 构造函数的初始化列表
	{
   
		//2 当前类类型的构造函数体
		strcpy(_name, name);
		_amount = amount;
		_price = price;
	}

指定了这个_date对象的构造方式(初始化方式),构造函数的初始化列表:做初始化用的(指定当前对象的成员变量的初始化方式)。 构造函数的初始化列表先执行, 当前类类型的构造函数体后执行。

把成员变量的初始化写在构造函数的初始化列表里面 和 写在当前类类型的构造函数体里面区别 如上:
第一个:定义这个变量的时候直接进行了初始化
第二个:先定义变量,然后赋值。对于这种简单类型的 实际上差不多。

但是如果是当前的CDate类类型,**只能把成员对象的初始化写在当前类的构造函数的初始化列表里面。
原因
1 在把成员对象的初始化写在构造函数的初始化列表里面情况如下:直接指定了这个_date对象的构造方式。

CGoods(const char* name, int amount, double price, int y, int m, int d)
	:_date(y, m, d)//1 构造函数的初始化列表
	,_amount(amount);
	,_price(price);

2 写在当前类类型的构造函数体里面情况如下:相当于先把对象构造了,然后给这个对象赋值。但是先把对象构造起来且没有指定构造方式,编译器调用的是默认的构造函数,但是它没有默认构造函数。(在CDate类里面自定义了一个构造函数,编译器就不会再产生默认构造了)

CGoods(const char* name, int amount, double price, int y, int m, int d)
	:_date(y, m, d)//1 构造函数的初始化列表
	,_amount(amount);
	,_price(price);
	{
   
		//2 当前类类型的构造函数体
		strcpy(_name, name);
		_data = CDate(y, m, d);
	}

构造函数的初始化列表 : 可以指定当前对象成员变量的初始化方式(尤其是对于 成员对象而言)

面试题
如下这段代码,的输出结果是?

class Test
{
   
public:
	Test
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值