C++类与对象(二) --- 初始化列表、隐式类型转换、静态成员函数及变量

初始化列表

成员变量若为以下形式

&引用、const变量、自定义成员类型,这些必须在定义时初始化的类型。

我们就要采用初始化列表对这些类型的成员变量进行定义。

初始化列表可以理解为:对对象成员变量进行定义。

初始化列表只能写一次,定义也只能定义一次。

其他类型的变量可以在初始化列表进行初始化,也可以在函数体初始化。

class A
{
public:
	A(int a,int b, int c) :_a(a)
		                  ,_c(c)
                          ,_b(b)
	{}

private:

	const int _a;
	B _b;
	int& _c;
};

class B
{
public:
	B(int _a):x(_a)
	{}

private:
	int x;
};

建议所有的函数都进行初始化列表。

初始化列表进行初始化的顺序不是在初始化列表进行初始化的顺序,而是与其在类中声明的先后顺序有关,以上述代码为例,初始化的顺序应为 a->b->c而不是定义时的 a->c->b

如果没有写初始化列表,构造函数也会去调用初始化,自定义类型会调用其默认构造函数,内置类型会创建为随机值。

隐式类型转换

对一个日期类Date,创建一个对象d1,如下操作

Data d1 = 2022;

这个操作不是将2022直接赋给d1,其中是产生了隐式类型转换,先对2022进行构造然后进行拷贝构造到d1。

在这里插入图片描述

一般编译器会进行优化,将 构造+拷贝构造 —> 优化成一步。

如果不想要优化,可以在构造函数前加上关键字explict,这样就不会只进行构造一步。

Date& d = 2022;

上面这段代码会报错,这是因为与上面一样产生了隐式类型转换

在这里插入图片描述

由于创建了一个临时变量,临时变量具有常性,所以要进行权限的缩小,才能进行引用。

const Date& d = 2022; 

静态成员函数及变量

静态成员变量属于是所有类对象共有的成员变量,每个变量更改的都是相同的静态成员变量。

静态成员函数要进行初始化不能在初始化列表进行初始化,而要在类外进行初始化。

class  A
{
  public:
         A(int a, int b, int c):_a(a)
                               ,_b(b)
         {}
  private:
    int _a;
    int _b;
    static int _c;   
};
int A::_c = 0;

静态成员函数他没有this指针,并且只能处理static变量。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值