再识构造函数——初始化列表——成员变量定义的地方
之前我们说:构造函数,对自定义类型会去调用他的默认构造函数,但是如果内置类型也没有写构造函数呢?
这里我们引用出——初始化列表(也是一种构造函数),:开头, ,分割
2、const 修饰的成员变量,初始化的时候要用初始化列表
3、引用变量初始化的时候要用初始化列表
总结:构造函数中能用初始化列表的经量用初始化列表,初始化列表的初始顺序,是和成员变量的声明顺序一致的,不是和列表顺序一致的
static 修饰成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用
static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化
静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
在类外面想要拿到静态成员变量的值,需要调用静态成员函数
例题:
解题:利用静态变量是整个类的变量,那么用这个类创建几个对象,利用静态变量的累加性,就可以实现
class Sum
{
public:
Sum()
{
_ret+=_i;
_i++;
}
static int Geti()
{
return _ret;
}
private:
static int _i;
static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:
int Sum_Solution(int n) {
Sum arr[n];
return Sum::Geti();
}
};
思考:1、静态成员函数可以调用非静态成员函数吗?
不能,因为静态成员函数里没有隐藏的this指针
2、非静态成员函数可以调用静态成员函数吗?
可以,
explicit关键字——防止隐式类型转换
构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值
的构造函数,还具有类型转换的作用。
两个相近的内置类型发生内置类型转换
类中只有一个成员变量的对象也可以发生隐式内存转换
类里虽然有多个成员变量,但是构造函数中有缺省值,只需要传一个参数就能够完成初始化的,对象也可以通过隐式类型转换创建
而在构造函数的函数名前面加上关键字explicit就可以组织隐式类型转换
友元
友元函数,——在类外面定义的函数,通过于类里面的相同名的函数声明建立友元关系,那么这个在类外面的函数也可以直接去访问类里面的私有变量
友元类——把一个类定义成另外一个类的友元,那么在这个类中就可以直接访问另外一个类的私有变量
友元是单向的,
友元关系不能传递
如果C是B的友元, B是A的友元,则不能说明C时A的友元。
内部类
一个类写在另一个类的里面:与分开写的区别就是,收到另一个类的域的限制,还有就是里面那个类的友元类是外面这个类(相当于里面那个类可以使用外面这个类的私有成员变量)
匿名对象
类名() 如果都早函数是全缺省那么()里就不用传参