PoEduo - C++阶段班【Po学校】-09复习Object.- 课堂笔记

一     复习Object

1-->类  属性  复习

1.0  类是抽象的,不实际的。  对象是实际存在的。

1.1  访问权限:1公有  public   2私有  private   3保护   protected

1.2  class生成的类中,默认为私有private属性。

1.3  struct(结构体)生成的类中,默认为公有public.

1.4  struct在C语言中是不能有函数的,在C++中可以有。


2-->类  复习 

 

2.0  默认构造函数,默认析构函数。默认构造函数是没有参数的,没有返回值。析构函数也是没有任何参数和返回值的。

2.1  初始化列 与 计算列的区别:1 引用的初始化 2const修饰过的数据初始化,这两种必须在初始化列进行初始化,计算列对引用和const数据无力。

2.2  初始化列里面是正儿八经的初始化,如int num = num;int &rnum= num;

2.3  转换构造时,用explicit禁止隐式转换。

2.4  拷贝构造,在什么时期会调用拷贝构造呢?如:1 Demo demo;   Demo demo1  = demo;   2参数传参的时候。3当函数返回一个对象,进行返回的时候。

2.5  默认的拷贝构造函数是一个空函数?  选择  A:是的。  B:不是的。  答案:B

2.6  默认拷贝构造里面不是空的,默认进行浅拷贝。

2.7  赋值函数也会默认生成,里面实现的也是浅拷贝。

2.8  取址运算符(operator*)   取址运算符(operator*)const版本,这里说的就是*而不是&。根据地址取里面的值

 



二     运算符的重载

 

 1-->运算符重载  原则 复习

1.0  两种方式重载  1成员函数  2友元函数

1.1  重载原则 :单目运算符重载:成员函数    双目运算符的重载:友元函数

1.2  友元分两种:一种是自身在前,一种是自身在后的。

1.3  赋值符号(=)取下标符号([])以及间接访问符号(->)这三种运算符无法重载为友元函数。虽然它们是双目运算符,但它们要用成员函数来进行重载。


 

2-->运算符重载 类转换 新知识点  

2.1  当一个自定义的类型如:Demo想转换成int类型,这就由operator int()出马了,如上图。

2.2  当然还可以重载已知类型:operator double()   operator long()  等。

2.3  类型转换重载,需要注意const版本的问题。


 

3-->智能指针 新知识点

 3.0  代码:

#include <iostream>

class Demo
{
private:
    int num_;
public:
    Demo(int num =0):num_(num){}
    void Open(){}
    void Close(){}
};

class MyPoint
{
private:
    Demo *demo_;
public:
    MyPoint()
    {
        demo_ = new Demo;
    }
    ~MyPoint()
    {
        delete demo_;
    }
    Demo* operator->()
    {
        return demo_;
    }
};

int main()
{
    MyPoint point;
    point->Open();
    point->Close();

    return 0;
}

3.1  最大的好处是:能够合适的时候进行释放。

3.2  写智能指针,关键点就是把operator->进行了重载。


 

4-->new关键字重写 新知识点 

 4.0  new是先分配空间,再调用构造函数;delete是先调用析构函数,再释放空间。

4.1  operator new会有几个版本,这里看两个重载:

    void* operator new()
    {

    }
    void* operator new(size_t size, const char* file, long line)
    {

    }

4.2  来看很少用的一种new:  这种方法很少用。

    char temp[255] = { 0 };
    int *pNum = new(temp)int(100);

4.3  改成自定义的:

#include <iostream>

class Demo
{
private:
    int num_;
public:
    Demo(int num =0):num_(num){}
    void Open(){}
    void Close(){}
};

class MyPoint
{
private:
    Demo *demo_;
public:
    MyPoint()
    {
        demo_ = new Demo;
    }
    ~MyPoint()
    {
        delete demo_;
    }
    Demo* operator->()
    {
        return demo_;
    }
    void* operator new()
    {

    }
    void* operator new(size_t size, const char* file)
    {

    }
};

int main()
{
    char temp[255]={0};
    MyPoint *pNum = new(temp)MyPoint();

    return 0;
}

这种使用new的方法很冷僻,很少用到。它相当于是:分配一片空间到tmep,它还有一个参数的,表示从哪个地方开始,分配到temp里。

 

posted on 2017-01-12 16:55  zzdoit  阅读(153)  评论(0编辑  收藏  举报

导航