3、类与对象下
类里面的成员函数被调用时,都是隐藏着this指针,而类外的函数没有this指针。
再谈构造函数:
初始化列表:类成员变量定义的地方,也就是初始化。
以一个冒号开始;逗号分隔;每个成员变量后面跟一个放在括号中的初始值或表达式。
注意:
每个成员变量在始化列表中只能出现一次(初始化只能初始化一次),
以下成员必须在初始化列表中初始化:
const成员变量;
引用成员变量;
自定义类型成员(无默认构造函数,也就是没有不需要传参的构造函数)。
成员变量在类中声明的顺序就是其在初始化列表中的初始化顺序,与在初始化列表中的先后次序无关。
explicit:
explicit修饰的构造函数,将会禁止单参构造函数的隐式转换,
如: Data d1=1; //正确的,但是其是将1隐式为临时的Data型变量,再将临时的变量拷贝给d1。
Data& d1=1; //错误的,因为1隐式转换的变量具有常性,不能改变,所以d1需要加const。
const Data& d1=1; //正确的。
如果加了explicit,就不能隐式转换了。
static成员
被static修饰的成员叫做静态成员,是存储在静态区的,是全局的,不是局限于某个对象使用的;
静态的成员变量一定在类外定义(初始化)。
特性:
静态成员变量为所有类对象所共有,不属于某个具体的实例。
静态成员变量必须在类外定义,定义时不加static关键字。
静态成员函数没有this指针,不能访问任何非静态成员。
非静态成员函数可以访问静态的成员函数。
因为类中各成员都是通过this指针来访问。
总结:
静态成员相当于全局成员,访问的时候不是由某个对象去访问,而是由类加域解释符访问。
如:Date::print();访问Date的静态成员方法。
类外不能直接访问类的私有成员,类内部可以直接访问,所以类外想要访问类内部成员,需要在类内部构建成员函数,在外部访问成员函数,继而访问类私有成员。
声明时给缺省值:
非静态成员可以在声明的时候给缺省值:
如:
private:
int _year=10;
int _month=2;
这都是声明的时候给了缺省值。
友元:(相当于朋友)
友元函数:相当于全局函数。
可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但是声明的时候需要在类内部声明,声明时需要加上friend关键字。
注意:
友元函数可以访问类的私有和保护成员,但不是类的成员函数。
友元函数不能用const修饰。
友元类:
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非共有成员 。
友元关系是单向的,不具有交换性。
友元关系不具有传递性。