C++——类和对象(二)成员初始化列表、静态成员、友元

    xiaoxiao2022-07-14  182

    接着上一次的类和对象篇,再次了解一些类和对象的知识

    类和对象的三大特性:

    封装、继承、多态

    一.构造函数

    1.成员初始化列表

    构造函数的作用就是用来为类的对象进行初始化的。

    之前,进行初始化是在构造函数内部为成员变量进行赋值;现在使用成员初始化列表来进行初始化。

    例:

    //在构造函数内部进行赋值操作 Date(int year = 1999, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } //使用成员初始化列表 Date(int year=1999, int month=1, int day=1) :_year(year), _month(month), _day(day) { }

    注意:

    1.每个成员变量只能在初始化列表出现一次。

    2.类中的以下成员,必须在初始化列表进行初始化

    ①引用

    ②const成员

    ③类类型(自定义类型,并且该类没有默认构造函数)

    3.编译器会先用初始化列表进行初始化,再进入构造函数内部。

    并且,自定义类型的初始化是一定会先通过成员初始化列表来初始化的。

    执行结果:

    4.成员变量在类中的声明顺序就是其在初始化列表中的初始化顺序,与其在初始化列表中先后次序无关。

    5.隐式类型转换

    Date d1(2019, 1, 1); //这个是构造 Date d2 = { 2000,1,1 }; //这个其实完成了三步, //1.Date tmp (2000,1,1); //2.Date d2=tmp //3.优化 (简化了步骤,不创建临时变量)

    6.explicit关键字(加在构造函数名前),用于消除隐式类型转换。即加上该关键字后,上述第二行代码会报错。

     二.静态成员变量

    1.定义格式:

    static  类型  变量名

    注意:静态成员变量必须初始化,而且得在类外初始化。

    在类外初始化的格式:

    类型  类名::变量名=初始值

    2.例:

    class A { private: int _data; public: A(int data) :_data(data) { } static int k; }; int A::k = 0;

    3.访问方式

    静态成员变量不属于某一个特定的对象,它属于该类的全体对象,即它属于整个类。

    ①通过对象

    ②通过类名

    int main() { A a1 = 10; a1.k++; A a2; a2.k++; cout << A::k << endl; system("pause"); return 0; }

    执行结果:2

    三.静态成员函数

    1.定义格式:

    函数名前加static关键字即可

    2.例:

    static int Print() { cout << k; return k; }

    静态成员函数没有this指针,故不能访问非静态成员,它属于整个类。

    总结一下Static的作用

    1.修饰局部变量,改变其生命周期到程序结束

    2.修饰全局变量、全局函数,改变其链接属性

    3.修饰成员函数,则该成员函数没有this指针,使其属于整个类,而非某个对象。

    4.修饰成员变量,使其属于整个类。

    四.友元函数

    1.友元函数的意义:当一个函数被声明为一个类的友元函数时,该函数可以忽略访问限定符的限制去访问类的成员变量。

    2.例:

    class A { private: int _data; public: A(int data=20) :_data(data) { } static int k; static int Print() { cout << k; return k; } friend int Friend(); }; int Friend() { A a; a._data = 100; cout << a._data << endl; }

    注意:类的友元函数不是类的成员函数,故在类外定义时,不要加作用域限定符。

    典型实例:用友元函数重载输出运算符

    //在类内的声明 friend ostream& operator<<(ostream& _cout, A a); //在类外的定义,由于不是成员函数,所以不要加类的作用域限定符 ostream& operator<<(ostream& _cout, A a) { _cout << a._data << endl; return _cout; }

    五.友元类

    1.定义格式:

    类前加friend关键字修饰

    友元类可以访问源类中的私有成员而不受访问限定符的限制。

    2.例:

    class B { public: int k; }; class A { private: int _data; friend B; public: A(int data=20) :_data(data) { } friend ostream& operator<<(ostream& _cout,A a); };

    注意:

    友元类可以声明在源类的任何位置(public、private、protected均可)。

     

     

    最新回复(0)