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

    条条英符铸平凡,行行代码显乾坤;
  • 相关阅读:
    C#处理json实战
    HDU3994(Folyd + 期望概率)
    POJ1270 Following Orders (拓扑排序)
    HDU 3634 City Planning (离散化)
    HDU4762(JAVA大数)
    POJ3026(BFS + prim)
    POJ1679(次小生成树)
    UVA10487(二分)
    ZOJ 2048(Prim 或者 Kruskal)
    FZU 1856 The Troop (JAVA高精度)
  • 原文地址:https://www.cnblogs.com/VisiousDragon/p/12116743.html
Copyright © 2011-2022 走看看