前面小编只是大概说了类的简单使用,并不代表全部的类用法。这里面还有重载函数如何写有何用、友元函数如何写有何用、静态变量如何定义、静态函数如何定义、父类如何初始化等等。
我们都知道,一个函数需要几个条件才能成立,修饰符+函数名+参数。
而说到函数的重载,它是有规则的,编译器不容两个完全一模一样的函数存在,说简单点就是修饰符相同+函数相同+参数也相同。
这不符合编译器的规则,会造成编译器报错!
重载的理念一出,就告诉了编译器函数重名可以用,但有一个条件,函数名相同,修饰符和参数就必须有一个不同。
在这里,有着C语言基础的朋友,想必能想到了吧。
举个例子,假如你创建了个类:Teacher
{ ....
public: //重载函数 void SetTeacherInformation(char *srcSource); void SetTeacherInformation(char *srcSource, int age); int SetTeacherInformation(char *srcSource, int age, char *sex); .... }
这三个函数名完全相同,小编对修饰符、参数进行了改变,函数名完全一样,但是编译器没报错,因此,就能看出重载的写法了。
关于重载的用法不单单于此,编译器为我们编好的就有着太多函数,小编捡几个常见的写写。
大家对于加、减、乘、除,或许不陌生吧,下面就用这个做最简单的重载函数。
{ ... public: //重载函数+-*/ Teacher & operator+(Teacher & teacher); Teacher & operator-(Teacher & teacher); Teacher & operator*(Teacher & teacher); Teacher & operator/(Teacher & teacher); ... }
这里的重载函数跟普通函数的写法一样,同样需要在类内部声明定义
{ ... //重载函数+-*/ Teacher & Teacher::operator+(Teacher & teacher) { a += teacher.a; b += teacher.b; return *this; } Teacher & Teacher::operator-(Teacher & teacher) { a -= teacher.a; b -= teacher.b; return *this; } Teacher & Teacher::operator*(Teacher & teacher) { a *= teacher.a; b *= teacher.b; return *this; } Teacher & Teacher::operator/(Teacher & teacher) { a /= teacher.a; b /= teacher.b; return *this; } ... }
为了方便用起来,请添加两个int类型的私有属性变量并进行封装。一个带参构造,参数就是两个int类型,同样达到为这两个私有属性进行封装的效果。
小编用class名为Teacher.就用带参构造的方法,省事。
封装的写法,意思就是说初始化Teacher这个类的对象时,就为两个两个私有属性赋值。
Teacher::Teacher(int a,int b) { this->私有属性变量=a; this->私有属性变量=b; }
这样我们在实例化对象时,就可以得到私有属性的值了。既然已写好了,我们就试着调用这个函数运行看看是否跟想象中的一样。
主体源文件Test.cpp
{ ... Teacher teacher(6,6); Teacher teacher2(6,6); teacher.operator+(teacher2); cout << teacher.GetA() << " " << teacher.GetB() << endl; ... }
结果就是两个12 12.
友元函数。个人觉得你不到那一步学了也用不到,对于项目而言,这个友元的用法完全破坏了封装的隐藏性,它就像是金手指,能获取到类的私有属性,有兴趣的朋友可以自己去找他人的博客了解下。
下面说说静态变量、静态函数的用法以及规则。
1.静态变量不能被非静态函数调用。
2.静态变量初始化方式跟普通的变量不一样,既然非静态函数不能调用,那么也就是说不能直接赋值。
要像函数那般写出来,我举个例子,假如有个static int a;的私有属性,它的赋值方式是:
int 类名::a = 数值自己定义;
3.全局静态变量不赋值的情况下,编译器自动为其赋值为0.(在静态数据区,内存中所有的字节默认值都是0x00【他人的说法】)。
4、反过来,静态成员函数不能调用非静态成员属性(静态成员必须与特定的成员相对【编译器的说明】)
父类的初始化,说白了就是两种,指针对象和对象。
{ ... Teacher t1; Student s; t1 = s; //子类直接赋值给父类对象 Teacher *t2 = &s; //子类对象地址引用给父类指针对象 Teacher &t3 = s; //子类对象初始化基类引用 Student *s2 = &s; Teacher *t4; t4 = s2; //子类指针地址赋值给基类指针地址 ... }
学会了今天的内容,就等于进步一点,凡事得积累,这过程跟就像是C语言,而自己本身就如同对象。学这门语言,操之过急那就是好高骛远,如果这些知识无法学会,后面的就更难了,既然学起来就得有觉悟!