C++第七课:类的使用[查漏补缺]

前面小编只是大概说了类的简单使用,并不代表全部的类用法。这里面还有重载函数如何写有何用、友元函数如何写有何用、静态变量如何定义、静态函数如何定义、父类如何初始化等等。

我们都知道,一个函数需要几个条件才能成立,修饰符+函数名+参数。

而说到函数的重载,它是有规则的,编译器不容两个完全一模一样的函数存在,说简单点就是修饰符相同+函数相同+参数也相同。

这不符合编译器的规则,会造成编译器报错!

重载的理念一出,就告诉了编译器函数重名可以用,但有一个条件,函数名相同,修饰符和参数就必须有一个不同。

在这里,有着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() << "\t" << 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语言,而自己本身就如同对象。学这门语言,操之过急那就是好高骛远,如果这些知识无法学会,后面的就更难了,既然学起来就得有觉悟!

posted @ 2019-12-29 22:00  邪气凛然  阅读(187)  评论(0编辑  收藏  举报