c++入门-->初始化列表,隐式类型转换,static

初始化列表:

1.初始化列表该如何使用先简单展示:(以之前用两个栈构造一个队列为例子)

class MyQueue {
public:
    MyQueue(int n)
        :st1(n)
        ,st2(n)

        ,i(1)
    {

    }

    const int i;
    ST st1;
    ST st2;
};

   :st1(n)
   ,st2(n)

    ,i(1)
    {

    }首先要按照这样的格式去进行初始化列表。i(1)相当于i=1,st1(1000)对应的是传入1000去对st1进行初始化,这里不要和后续的优化进行混淆,这里就是初始化的地方!!!


2.解析为什么在这里用初始化列表:

当不使用初始化列表的时候,因为自定义类型会去调用类中的默认构造,(1)首先是如果默认构造不是全缺省的,那么因为其中的参数固定,没办法满足你的要求;在这里先回顾一下,默认构造包括:全缺省,系统自带,像Myqueue这种去调用stack中构造函数的这三种称为默认构造。(2)其次是,如果你写构造函数是非全缺省的构造函数,那么会报错的。


3.初始化列表需要注意的事项:

(1)初始化列表圣经:初始化列表是所有成员变量初始化的地方。(你就算没在这写,也一定要走这里)

(2)那么初始化列表是否存在必须在定义的时候要先初始化的东西呢?1.const,2.对象中自定义类型的对象变量不存在默认构造,3.引用成员变量。例子如下:

(3)特殊情况下也需要进行初始化:例如在模拟vector的时候,因为vector中的私有成员变量是指针,这个时候如果进行拷贝构造的时候,调用push_back,但是你这个时候并没有进行初始化,那就会导致它reserve的扩容失效,导致后续出现问题,所以,建议直接按第一个图所示(也就是4将要展示的),先给定初始化。

(假设如果这里没有进行直接进行初始化)

4.成员变量能直接先在私有变量定义的那个地方给初始值:

例如:

但是,你应该也发现了,在这里写的话自定义类型的变量写的也是=(实际上也可以={1} ),这就和初始化列表有所差异,但是呢,实际在走的时候,是先走初始化列表,如果初始化列表没有写,才会来这里找初始值。

补充:初始化列表的时候是按找声明的顺序进行初始化的,与初始化写的顺序没有关系:由下图可得知:

这里a并不是1,而是0(vs中初始化列表中b默认的随机值是0,看编译器)


隐式转换:

5.构造加拷贝构造会进行隐式类型转换:(例子如下:)

A a=1的过程中,首先是A a=这里编译器会尝试找一个A类型的对象,但是这里出现的是1,于是编译器就尝试把1传给一个临时对象再用于A类型的构造去对这个对象进行初始化,最后把这个对象给a进行拷贝构造。


6.补充:  

 A a = (1, 1);这个时候因为是用的等号等效了(),在传入两个参数的时候这样是错的,这样会因为逗号表达式(每个表达式均运算后,最终返回最后一个表达式的值)返回的实际上只有一个1,真想用要用{1,1}

所以呢,这里你去引用的时候发现不行,也不是因为1和它的类型不同,是在这个过程中产生了临时变量(具有常性)。

但是实际上,编译器会优化这个过程,它会不进行这样繁琐的过程,会隐式转换直接进行aa的构造。


static:

7.static修饰对象成员变量

(1)static修饰的成员变量(存放在静态区)不再能在私有属性中给初始值,需要在外部给初始值,否则为随机值。例如:(下图所示代码)

(2)静态成员变量,不属于任意一个对象,不走初始化列表,它是属于一个类的,在别的类调用它的时候,得考虑是不是私有的,如果是私有的一般需要调用静态成员函数。

private:
	static int sta_i;
	const int i=1;
	const int& d=i;
	int a;
	int b;
	ST st1=1000;
	ST st2=1000;
};
int MyQueue::sta_i = 0;

8.static修饰对象成员函数:

(1)静态的成员函数没有this指针,所以不能访问私有变量,但是可以访问静态成员变量。

(2)在外部使用类名+::去引用静态成员成员函数,对于单个的对象如果使用非静态成员函数则使用.  ,记住是单个的对象才是用这一个。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值