美文网首页
【GeekBand】Week01-类的简介

【GeekBand】Week01-类的简介

作者: 狗蛋同学 | 来源:发表于2016-07-21 19:28 被阅读0次

    关于类与C++

           C++中的类与C语言中的struct(结构体)类似,所不同的是struct中的数据为public类型;

    关于数据与函数

           C语言中使用函数(function)处理数据(data),在C++中,将数据和处理它们的函数放在一起,也就是放在类中

    基于对象(Object Based)和面向对象(Object Oriented)

    Object Based:面对的是单一Class的设计;

    Object Oriented:面对的是多重Classes的设计,注重类与类之间的关系

    头文件的防卫式声明(guard)

    防卫式声明可以避免重复声明(declaration)和定义(definition)。

    类的声明

    由class head和class body组成;

    class body中的数据和函数有public、private、protected三种类型;

    其中,public对外可见;private对外不可见,对内可见。

    “operator +=”是什么?

    即“运算符重载”

    对于我们声明的complex(复数)类,我们想让它可以做数学上的加减乘除运算,然而C++并未内置和复数有关的运算符,只有能够操作整数和浮点数的+、-、*、/、++、--,以及赋值运算符+=、-=、*=、/=。如果我们声明了两个complex的对象c1和c2,分别对应复数(1,1)和(2,2),想要实现(1+1i)+(2+2i)=(3+3i)的效果,就必须对“+”这个运算符进行重载。

    例如:

    这个例子中,分别对“复数+复数”、“复数+double”、“double+复数”三种情况,对加号运算符进行了重载。

    另外,__doapl函数是“do assignment plus”的意思,即赋值加法(+=)。

    为何声明为“friend”(友元)?

    由于类的封装性,类外部的函数是无法访问到类内的private成员的。但是也会有在类外使用类内成员变量的可能性,如果再把这些成员变量定义为public,又破坏了类的封装性。

    因此要解决这种问题,就有了friend友元的方案。友元可以自由访问对应的类中的数据,而不受private的限制。

    友元函数的定义在类外,但是声明时在类内,并在前面加上“friend”关键字。

    同时可以这样理解:同一个类的各个成员之间互为friend。

    何时pass by value(传值)?何时pass by reference(传引用)?

    对于函数传参的场景,value和reference该如何取舍呢?

    对于引用,可以理解为编译器在编译阶段将引用翻译为指针来处理,因此引用通常只占用4个字节,对于要传递的参数大小超过4个字节的情况,传引用将会提高效率。

    关于返回值传递引用return by reference

    传递者无需知道接收者是否是以reference(引用)形式接收的。

    很多情况下返回值应该尽量传递引用,但是对于以下三个函数:

    返回一个引用是不恰当的。这是因为在这些函数里面,返回值是一个临时对象temp object,它在函数体外将被销毁,传递一个被销毁对象的引用将会导致未定义行为(undefined behavior)。

    关于构造函数(constructor)

     ● 构造函数是在类的对象的初始化时被调用,通常用来对成员变量进行赋值。

     ● 构造函数可以有默认参数,如果调用时未指定参数,那么构造函数将根据默认参数来初始化成员变量。默认参数如下图:

     ● 构造函数可以有重载。重载的定义为:

    在相同的声明域中,函数名相同,而参数表不同。通过函数的参数表而唯一标识并且来区分函数的一种特殊的函数用法。

    参数表的不同表现为:

    1、参数类型不同;

    2、参数个数不同;

    因此对于下面这两个函数,是会出现重定义错误的:

    ● 构造函数可以放在private里面,是单例模式(Singleton)的写法,保证了一个类在系统中只能有一个实例。

    关于声明为const的成员函数

    成员函数可以声明为const,如图:

    即保证该成员函数不会改变任何成员变量。虽然有些时候,这个const看起来并不是必需的,但对于下列情况:

    const complex c1(2, 1);

    cout << c1.real();

    cout << c1.imag();

    假如real()和imag()并没有const标示,那么这段代码就会出错。这是因为:

    const对象只能调用const成员函数;

    而非const对象可以调用const成员函数或非const成员函数;

    相关文章

      网友评论

          本文标题:【GeekBand】Week01-类的简介

          本文链接:https://www.haomeiwen.com/subject/abhyjttx.html