自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 Linux当中解决apt-get install E: 无法定位软件包问题(附上详细步骤以及注释)

ubuntu-18.04,使用apt-get update 安装软件过程,出现定位软件包问题。花了一个多小时,终于解决了! 以下内容均为亲测,所有安装详细步骤以及注释如下:(1)找到源镜像,备份cd /etc/apt/ // 切换到/etc/apt/ 目录下sudo cp sources.list sources.list.old // 先把源文件复制到sources.list.old,备份此时,你可以看到在/etc/apt/ 目录下

2021-04-11 22:35:46 97040 16

原创 虚析构函数如何解决内存泄漏问题

虚析构函数析构函数的作用是在对象撤销之前做必要的“清理现场”的工作。但派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构雨数,但是,如果用new运算符建立了临时对象,若基类中有析构函数,并且定义了一个指向该基类的指针变量,在程序用带指针参数的delele运算符撤销对象时,会发生一个情况, 即系统会只执行基类的析构函数,而不执行派生类的析构函数。以下示例演示了一个析构函数调用不恰当带来的内存泄漏情况:// 析构函数调用不恰当带来的内存泄漏.cpp : 定义控制台应用程序的入口点。

2021-04-01 15:15:32 684

原创 动态内存分配 (详解版)

动态内存分配 (详解版)malloc和freeC++语言允许使用C语言标准库函数中malloc和free申请和释放内存,保留这两个函数主要有以下3点考虑:C++程序经常要调用写好的C函数,而在C语言中,只能使用malloc和free;如果C++程序要允许在C语言环境下,必须使用malloc和freenew和delete的功能是通过调用malloc和free来实现的new和delete是C++运算符,new和delete是C标准库函数。C函数库提供了malloc和free两个函数,分别用于执

2021-03-18 20:31:27 16195 4

原创 Effective C++ 详解条款23:宁以non-member、non-friend替换member函数

总结:宁可拿non-member non-friend函数替换member 函数。这样做可以增加封装性、包裹弹性(packaging flexibility)和机能扩充性。举例:一个class用来表示网页浏览器。这样的class可能提供的众多函数中,有一些用来清除下载元素高速缓存区、清除访问过的URLS的历史记录、以及移除系统中的所有cookies:class webBrowser {public: ... void clearCache( ); void clearHisto

2021-05-18 22:23:03 488 1

原创 Effective C++ 详解条款22:将成员变量声明为private

假设有一个public成员变量,若最终取消了它。则所有使用它的客户码都会被破坏,而那是一-个不可知的大量。因此 public成员变量完全没有封装性。假设有一个protected成员变量,若最终取消了它,则所有使用它的derived classes都会被破坏,那往往也是个不可知的大量。因此,protected成员变量就像public成员变量一样缺乏封装性,因为在这两种情况下,如果成员变量被改变,都会有不可预知的大量代码受到破坏。一旦你将一个成员变量声明为public或protected而客户开始使用它,就

2021-05-18 20:47:08 384 1

原创 Effective C++ 详解条款21:必须返回对象时,别返回其reference

如果在stack空间创建一个local变量,并且你函数返回一个reference指向该local对象,将导致”无定义行为“,同样在,heap上也会导致operator*使用者不能获取到reference背后的指针而资源泄漏。//考虑一个用以表现有理数(rational numbers)的 class,内含一个函数用来计算两个有理数的乘积:class Rational {public: Rational (int numerator = 0,int denominator 1) ;

2021-05-17 19:51:18 334 1

原创 关于内联函数inline知识点

新的一周开始了!!还有一个月就要成为打工人,在这之前再多回顾多学习一些知识吧。ღ( ´・ᴗ・` )函数的引入可以减少程序的代码量,使得函数程序可以在代码间共享。但函数调用需要一些时空开销。在调用函数时,要先中断调用函数,将执行流程转移到被调函数中,待被调函数执行完毕后,返回调用函数。对于较长的函数,这种开销可以忽略不计。但对于很短的、调用频繁的函数体,这种开销不能忽略。例如void print(int x){ cout<<x<<endl;}使用函数可以提高程序

2021-05-17 10:34:03 254

原创 Effective C++ 详解条款20. 以pass-by-reference-to-const替换pass-by-value

缺省情况下C++以by value方式传递对象至函数,但pass by reference to const没有任何构造函数或析构函数被调用,因为没有任何新对象被创建,没有任何对象被调用,所有效率更高。以by reference方式传递参数也可以避免对象切割问题。当一个derived class对象以by value方式传递并被视为一个base class对象,base class的copy构造函数会被调用,而“造成此对象的行为像个derived class对象”的那些特化性质全被切割掉了,仅仅留下一个

2021-05-16 22:16:05 123

原创 码住!!!如何设计高效的classes——Effective C++ 详解条款19:设计class犹如设计type

Class 的设计就是type的设计。在定义一个新type 之前,请确定你已经考虑过本条款覆盖的所有讨论主题。因此,如何设计高效的classes,必须考虑以下问题:新type 的对象应该如何被创建和销毁?这会影响到你的class的构造函数和析构函数以及内存分配函数和释放函数的设计。(可参考第8章条款49-52)对象的初始化和对象的赋值该有什么样的差别?这决定你的构造函数和赋值操作符的行为以及其间的差距。别混淆了初始化和赋值,因为它们对应于不同的函数调用。(可参考条款4)新type

2021-05-11 21:54:36 118

原创 Effective C++ 详解条款18. 让接口容易被正确使用

例子1:导入简单的外覆类型假如有一个用来表现日期的class设计构造函数:class Date{public: Date(int month, int day, int year);}使用者很容易犯下两个错误:1.以错误的次序传递参数。2.传递一个无效的月份或天数。为了预防这样的问题,可以导入新的类型来获得预防,即导入外覆类型(wrapper types)来区别天数、月份和年份,然后于构造函数中使用这些类型:struct Day{ explicit Day(int d):val(d)

2021-05-09 22:31:25 210

原创 Effective C++ 详解条款17:以独立语句将newed对象置入智能指针

在语句内,编译器拥有自由度,容易泄露资源,processwidget (std::tr1::shared_ptr<Widget>(new widget), priority ()) ;在对processwidget的调用过程中可能引发资源泄漏,因为在“资源被创建(经由“new widget")”和“资源被转换为资源管理对象”两个时间点之间有可能发生异常干扰。解决办法:使用分离语句。(1)创建widge;(2)将它置入一个智能指针内,然后再把那个智能指针传给processwidget:

2021-05-07 11:33:50 142 2

原创 Effective C++ 详解条款16:成对使用new和delete时要采取相同形式

当你使用new(也就是通过new动态生成一个对象),有两件事发生:第一,内存被分配出来;第二,针对此内存会有一个(或更多)构造函数被调用。当你使用delete,也有两件事发生:针对此内存会有一个(或更多〉析构函数被调用,然后内存才被释放。delete的最大问题在于:即将被删除的内存之内究竟存有多少对象。这个问题的答案决定了有多少个析构函数必须被调用起来。实际上这个问题可以更简单些:即将被删除的那个指针,所指的是单一对象或对象数组?这是个必不可缺的问题,因为单一对象的内存布局一般而言不同于数组的内存布局

2021-05-07 11:12:25 93

原创 Effective C++ 详解条款15: 在资源管理类中提供对原始资源的访问

假期归来第一天!!!!学习起来up up up ღ( ´・ᴗ・` )ღ比心由条款13导入一个例子:使用智能指针如auto_ptr或tr1: :shared ptr保存factory函数如createInvestment的调用结果:std::tr1::shared_ ptr<Investment> pInv (createInvestment()); //见条款13假设你希望以某个函数处理Investment对象,像这样:int daysHeld (const Investment*.

2021-05-06 20:54:57 137

原创 Effective C++ 详解条款14: 在资源管理类中小心coping行为

许多资源被动态分配于堆 heap 内而后被用于单一区块或函数内。它们应该在控制流离开那个区块或函数时被释放。标准程序库提供的auto_ptr 正是针对这种形势而设计的。条款13就描述了auto_ptr和 tr1 : :shared_ptr是如何将“资源取得时机便是初始化时机(Resource Acquisition Is Initialization,RAII)”表现在基于堆(heap-based)资源上。然而并非所有资源都是heap-based,对那种资源而言,像auto_ptr和 tr1 : :sh

2021-05-04 18:54:13 335 1

原创 Effective C++ 详解条款13:以对象管理资源(不是只会用delete就够了!)

本条款建议,如果你打算手工释放资源(例如使用delete而非使用一个资源管理类; resource-managing class),容易发生某些错误。罐装式的资源管理类如auto_ptr和 tr1 : :shared_ptr往往比较能够轻松遵循本条款忠告。void f( ){ Investment* pInv = createInvestment ( ); //调用factory函数 ... delete pInv; //释放pInv

2021-05-03 21:48:44 121 1

原创 干货来啦~~~《深入理解计算机系统》第一章重要知识点(详解版)

文章目录源程序文件到可执行文件过程处理器读并解释内存中的指令1. 系统的硬件组成2. 程序是如何运行的操作系统管理硬件进程线程虚拟内存文件系统之间如何利用网络通信源程序文件到可执行文件过程hello程序的生命周期是从一个高级C语言程序开始的,因为这种形式能够被人读懂。然而,为了在系统上运行 hello.c程序,每条C语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件。在Unix系统上,从

2021-04-23 21:23:41 399

原创 来扒拉一下哈希表

又是读书崽崽学习的一天文章目录哈希表什么是哈希表哈希函数的构造方法1. 直接定址法2. 平方取中法3. 折叠法4. 除留余数法处理冲突的方法1. 开放定址法2. 再哈希法3. 链地址法散列表查找实现哈希表哈希表:建立一种数据元素的关键字与数据元素存放地址之间的对应关系,使得元素的关键字与唯一的存储位置对应 ,通过数据元素的关键字直接确定其存放的位置。什么是哈希表key表示元素的关键字,f表示对应关系,则f(key)表示元素的存储地址,这种对应关系f称为哈希函数,利用哈希函数可以建立哈希表。哈希函

2021-04-22 20:29:22 108

原创 关于字符串的数据结构知识点都在这了,太难的我也不会了QAQ

这里写目录标题串的定义串的比较抽象数据类型串的基本操作串的存储结构串的顺序存储结构串的块链式存储结构串的模式匹配朴素的模式匹配算法(Brute-Force)KMP模式匹配算法(KnuthMorris-Pratt算法 )串的定义由零个或多个字符组成的有限序列,又名叫字符串。区分部分概念:1、空串,零个字符的串;2、空格串,是只包含空格的串。注意它与空串的区别,空格串是有内容有长度的,而且可以不止一个空格。3、子串与主串,字符串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串.

2021-04-21 20:29:55 525

原创 你会copying了吗?(Effective C++ 12 复制对象时勿忘其每一个成分)

12. 复制对象时勿忘其每一个成分为derived class写copying函数时,必须很小心地复制其base class成分。那些成分往往是private,故无法直接访问它们,应该让derived class的copying函数调用相应的base class函数。让copy assignment操作符调用copy构造函数是不合理的,因为就像试图构造一个已经存在的对象;让copy构造函数调用copy assignment操作符也同样无意义。构造函数用来初始化新对象,而 assignment操作符只.

2021-04-06 20:45:05 150

原创 友元 基础详解版 (友元函数、友元类、友元非成员函数和友元成员函数)

友元一般来说,类的公有成员能够在类外访问,私有的成员只能被类的其他成员函数访问。在C++中,可以定义友元,如果某一个函数定义为类的友元,则该函数就可以访问该类的私有函数。也可以把一个类定义为另一个类的友元。友元函数如果在某个类的定义中用friend声明了一个外部函数(或者是其他类的成员函数,既可以是public型,也可以是private型)后,这个外部函数称为类的友元函数。C++提供一种允许外部类和函数存取类的私有成员和保护成员的辅助方法,即将它们声明为一个给定类的友元(或友元函数),使其具有类成

2021-04-06 09:21:08 1137

原创 operator= 中的“自我赋值”(Effective C++ 学习笔记详解11)

11:在operator= 中处理“自我赋值”自我赋值发生在对象被赋值给自己,class widget { ... };widget w;...w= w; //赋值给自己a[i] = a[j]; //潜在自我赋值(i=j)*px = *py; //潜在自我赋值(px和py相同)如果尝试自行管理资源,可能会掉进“在停止使用资源之前意外释放了它”的陷阱。假设你建立一个class用来保存一个指针指.

2021-04-05 11:05:01 432

原创 Effective C++ 关于operator(学习笔记详解09-10)

09:绝不在构造和析构过程中调用virtual函数1.base class构造函数执行早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化。2.同样地,一旦derived class构造函数开始执行,对象内的derived class成员变量便呈现未定义值。在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class。10. 让operator=返回一个reference to *th.

2021-04-04 17:21:18 125

原创 Effective C++ (学习笔记详解08)

Effective C++ (学习笔记详解)08:别让异常逃离析构函数如果析构函数必须执行一个动作,而该动作可能会在失败时抛出异常,例如class DBConn{ //class 用来管理DBConnetive对象public: ~DBConn(){ //确保db总能被关闭。但是一旦调用产生异常,析构函数就会传播该异常 db.close(); }private: DBConnetive db;};两个办法避免该问题。DBConn的析构函数可以

2021-04-03 14:32:27 102

原创 Effective C++ (学习笔记详解07)

07:为多态基类声明virtual析构函数当派生类对象经由一个基类指针被删除,而该基类带着一个非虚析构函数,其结果未有定义。因为实际执行时,通常对象的派生类成分没被销毁。解决办法:给基类一个虚析构函数。如果一个类不含虚函数,通常表示它并不想被用作一个基类,此时令其析构函数为virtual是一个馊主意。polymorphic(多态性质的)base classes应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。classes设计

2021-04-02 16:24:00 95

原创 一文带你理解虚函数、纯虚函数 (以程序实例详解区分)

文章目录1、多态与虚函数静态联编动态联编**实现动态联编必须满足以下3个条件:**为什么需要虚函数2、虚函数的访问对象名访问基指针访问引用访问3、纯虚函数与抽象类纯虚函数声明和定义抽象类1、多态与虚函数多态性:指同一个操作作用于不同的对象就会产生不同的响应。多态性分为静态多态性和动态多态性,其中函数重载和运算符重载属于静态多态性,虚函数属于动态多态性。C++是依靠虚函数来实现动态和多态的。静态联编以函数重载为例,C++编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数,称为联编。编译器

2021-03-31 21:33:55 583

原创 区分基类、派生类、多基派生、虚基类

文章目录定义基类和派生类多基派生虚基类派生类的构造函数派生类的析构函数定义基类和派生类class 派生类名:派生方式 基类名{ private: 新增私有成员列表; public: 新增公开成员列表;};三种数据成员、三种派生方式及访问权限派生方式privateprotectedpublic基类成员privateprotectedpublicprivateprotectedpublicprivateprotectedpublic

2021-03-30 17:15:51 1391

原创 《C++ primer》第五版学习笔记--第七章 类

《C++ primer》比其他C++相关书籍,知识点细致很多很多,每次看书都会有新的理解~文章目录定义抽象数据类型定义成员函数引入`this`引入常量成员函数在类的外部定义成员函数定义一个返回this对象的函数定义类相关的非成员函数类的基本思想:数据抽象和封装数据抽象是一种依赖于接口和实现分离的编程技术。类的接口包括用户所能执行的操作;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是,类的用户只能使

2021-03-28 22:34:31 204

原创 Effective C++ (学习笔记详解05-06)

文章目录05 :了解C++默默编写并调用哪些函数06: 若不想使用编译器自动生成的函数,就该明确拒绝。05 :了解C++默默编写并调用哪些函数空类Empty class,C++处理之后,如果你没有自己声明,编译器就会它声明一个拷贝构造函数,拷贝赋值函数和析构函数,甚至是default构造函数。所有这些函数都是public且inline的。如果你写了,class Empty{ }; 经过C++处理后相当于:class Empty{public: Empty(){...};

2021-03-27 09:27:09 109

原创 Effective C++ (学习笔记详解04)

文章目录04 确定对象被使用前已先被初始化1. 内置类型2. 非内置类型3. 跨编译单元之初始化次序总结04 确定对象被使用前已先被初始化1. 内置类型读取未初始化的值会导致不明确的行为。比如:int x;在某些语境下x保证被初始化(为0),但在其他语境中却不保证。处理办法:永远在使用对象之前先把它初始化。对于无任何成员的内置类型,必须手工初始化。int x = 0; //对int进行手工初始化const char* text = "A

2021-03-26 15:49:16 191

原创 Effective C++ (学习笔记详解 01~03)

Effective C++ (学习笔记详解)文章目录Effective C++ (学习笔记详解)01 :视C++为一个语言联邦02: 尽量const、enum、inline替换#define1、const2、enum3、inline03 :尽可能使用const1、**`const`语法使用**2、STL迭代器3、const成员函数01 :视C++为一个语言联邦C++的四个次语言:C:C++是在C语言的基础上发展而来的;Object-Oriented C++:这是C++中不同于C的部分,这里

2021-03-26 09:41:39 187

原创 数据结构之线性表

一、线性表定义:零个或多个数据元素的有限序列,线性表元素的个数n 定义为线性表的长度,当n=0时,为空表。二、线性表的顺序存储1. 定义:线性表的顺序存储:指用一段地址连续的存储单元依次存储线性表的数据元素。线性表的每个数据元素的类型都相同,可以用C语言的一维数组来实现顺序存储结构,即把第一个数据元素存到数组下标为0的位置中,接着把线性表相邻的元素存储在数组中相邻的位置。线性表的顺序存储的结构代码:#define MAXSIZE 20 //存储空间初始分配量typedef .

2021-03-25 09:32:45 279

原创 函数调用之三种函数参数传递,今天终于分得清楚了!

形参和实参函数的形参和实参具有以下特点:1.形参变量只有在被调用的时候,才会分配内存单元,在调用结束是,即刻释放所分配的内存单元。,因此,形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量。2.实参可以是变量、常量、表达式、函数等等,无论实参是何种类型的,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此,应预先用赋值、输入等办法使实参获得确定值。3.实参和形参在数量上、类型上、顺序上应该严格一致,否则会发生“类型不匹配”的错误。4.函数调用中发生的数据传

2021-03-24 10:08:58 3669

原创 数组和指针微妙关系,你知道多少

每次学习都能比之前理解得更好一些,说到底,还是自己运用的不够多。加油加油,冲冲冲!数组数组名的值是一个指针常量,也就是数组第1个元素的地址。它的类型取决于数组元素的类型:若是int类型,那么数组名的类型就是“指向int的常量指针”;若是其他类型,则数组名的类型是“指向其他类型的常量指针”特殊:只有在两种场合下,数组名并不用指针常量来表示:1.当数组名作为sizeof操作符,sizeof返回整个数组的长度,而不是指向数组的指针的长度。即返回整个数组所占用的字节而不是一个指针所占用的字节。2.单目操

2021-03-23 11:39:58 279

原创 字符串、字符和字节

三者关系:字符串是由一个个字符组成的,每个字符又由一个或多个字节来表示,每个字节又由8个bit位来表示。字符:计算机中使用的文字和符号,比如1、2、A、B、%等等。字节(Byte):一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。不同编码里,字符和字节的对应关系不同:①ASCII码中,一个英文字母占一个字节的空间,一个中文汉字占两个字节的空间。②UTF-8编码中,一个英文字符等于一个字节,一个中文等于三个字节。③Unicode编码中,一个英文等于两个字节,一个中

2021-03-22 11:30:25 3620 6

原创 字节对齐—结构体变量的sizeof

首先回顾一下,32位与64位(指的是寄存器的位宽)操作系统下,不同数据类型所占的字节数:32位操作系统环境下:字符型:char 1; unsigned char 1整型: int 4;unsigned int 4 ;short 2 ;unsigned short 2;long 4;unsigned long 4;浮点型:float 4;double 8;long double 8;unsigned long double 8;unsigned double 8;字符串型:string.

2021-03-20 11:38:53 235

原创 C/C++ 结构体基础知识

结构结构是比数组更为灵活的一种数据结构,将不同的数据类型的变量集合到一个整体,这个整体便称之为结构。定义形式:struct 结构名称(或称标识){ 存储数据列表;(或称成员变量列表)};struct student{ char name[20]; int age; float weight;}注意:标签字段允许多个声明使用同一个成员列表,并且创建同一种类型的结构。此时这个声明把标签student和成员列表联系在一起,但并没有提供变量列表,所以并未创建任何变量。

2021-03-19 20:59:26 141

原创 《C++ primer》第五版学习笔记--第二章知识点及习题(3)

第二章 变量和基本类型2.4 const限定符关键字const 对变量的类型一旦限定,其值就不能再改变。所以,const对象必须初始化,初始值可以是任意复杂的表达式。const int i = get_ size() ; //正确:运行时初始化const int j = 42; //正确:编译时初始化const int k; //错误:k是一个未经初始化的常量 如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关

2020-10-24 20:43:16 209

原创 《C++ primer》第五版学习笔记——第二章知识点及习题(2)

附:《C++ Primer》的第二章的指针部分,主要是指针的基础,可以很好地区分与引用的区别。关于指针与数组在后面的章节还会有详解。后续结合王慧、王浩的《零基础学C++》理解的更深刻一些,害,可能还是我太菜了。第二章 变量和基本类型2.2 变量2.2.1 变量定义基本形式:类型说明符 变量名1,变量名2,…;当对象在创建时获得了一个特定的值,我们说这个对象被初始化(initialized)了。术语:何为对象?C++程序员们在很多场合都会使用对象(object)这个名词。通常情况下,对象是指

2020-10-07 11:37:05 707

原创 《C++ primer》第五版学习笔记——第二章知识点及习题(1)

第二章2.1基本内置类型2.1.1 算术类型两类:整型(包括字符和布尔类型在内)和浮点型其他字符类型用于扩展字符集,如wchar_ t、char16_ _t、char32_ t。wchar_ t类型用于确保可以存放机器最大扩展字符集中的任意一个字符,类型char16_ _t和 char32_ _t则为Unicode字符集服务(Unicode 是用于表示所有自然语言中字符的标准)。带符号类型和无符号类型除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed) 和无符号的(unsi

2020-10-06 11:58:13 359

原创 《C++ primer》第五版学习笔记——第一章知识点及习题

附:此笔记是为了记录自己学习《C++ primer》中文版第5版的学习过程,同时督促自己,“希望有一天,自己从来不缺从头再来的勇气”,在此之前看的C++的书都很杂乱,所以想系统性地再认真学一遍,打好基础。书中使用最多的编译器是GNU编译器4.7.0,本人使用的Dev-C++ 5.11,并对书中的练习进行了相应解答,仅供参考,有错误的地方,欢迎联系我指正,十分感谢。第一章 开始0 示例编写一个程序来解决简单的书店问题。要求:书店保存所有销售记录的档案,每条记录保存某本书的一次销售的信息(一册或多册

2020-10-05 21:11:34 241

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除