<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[FightFightFight的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/FightFightFight</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; FightFightFight]]></copyright><item><title><![CDATA[[Unix] Unix C 中access(),snprintf(),open(),write()函数的使用]]></title><link>https://blog.csdn.net/FightFightFight/article/details/89057213</link><guid>https://blog.csdn.net/FightFightFight/article/details/89057213</guid><author>FightFightFight</author><pubDate>Sat, 06 Apr 2019 16:29:29 +0800</pubDate><description><![CDATA[1.access()函数
access()函数根据参数中给定的模式(位的形式)来检查调用进程对文件的权限。
头文件：&lt;unistd.h&gt;
函数原型:
int access(const char* path, int mode);

参数：

const char* __path：文件路径;
int __mode：模式，有四种：

R_OK:可读权限;
W_OK:可写权限;
X_OK:可...]]></description><category></category></item><item><title><![CDATA[[Linux] Ubuntu配置安装总结]]></title><link>https://blog.csdn.net/FightFightFight/article/details/88928028</link><guid>https://blog.csdn.net/FightFightFight/article/details/88928028</guid><author>FightFightFight</author><pubDate>Sun, 31 Mar 2019 19:59:30 +0800</pubDate><description><![CDATA[每次重装一个新的Ubuntu后，都需要配置安装多个应用，这里对一些配置进行下总结。以下安装都是在Ubuntu 16.04上进行的。
1.Ubuntu安装Google拼音输入法
之前一直使用搜狗拼音，但老是崩，越用越气人，还是Google拼音nice一点。


1.执行sudo apt-get install fcitx-googlepinyin安装Google拼音;


2.执行im-config...]]></description><category></category></item><item><title><![CDATA[[C++] 为什么const char**形参不能接收char**类型的实参？]]></title><link>https://blog.csdn.net/FightFightFight/article/details/88563897</link><guid>https://blog.csdn.net/FightFightFight/article/details/88563897</guid><author>FightFightFight</author><pubDate>Fri, 22 Mar 2019 00:45:06 +0800</pubDate><description><![CDATA[我们知道，const存在的意义之一，就是在对形参进行限定，从而达到防止修改实参的作用。使用const形参的理由有如下三条：








]]></description><category></category></item><item><title><![CDATA[[设计模式] 适配器模式]]></title><link>https://blog.csdn.net/FightFightFight/article/details/88563577</link><guid>https://blog.csdn.net/FightFightFight/article/details/88563577</guid><author>FightFightFight</author><pubDate>Thu, 14 Mar 2019 23:00:21 +0800</pubDate><description><![CDATA[1.概述
在编程中，每个程序员都可能会遇到这样的问题：方法a()需要A类型的参数,然而我想让B类型的对象作为方法a()的参数进行传递并调用B中定义的方法，A,B两个类型完全不兼容，如何实现这个需求呢？这时就需要适配器出场了。
2.定义
适配器模式，是指将一个接口类型转化为另一个接口类型，从而可以让原本不兼容的类可以合作无间。
3.使用场景
当方法参数和现有实参类型不匹配时，需要创建适配器进行接口类...]]></description><category></category></item><item><title><![CDATA[Android 9.0 JobScheduler(四) Job约束条件的控制]]></title><link>https://blog.csdn.net/FightFightFight/article/details/86705847</link><guid>https://blog.csdn.net/FightFightFight/article/details/86705847</guid><author>FightFightFight</author><pubDate>Wed, 30 Jan 2019 17:04:52 +0800</pubDate><description><![CDATA[上一篇文章：JobScheduler源码分析(三) Job从创建到执行
在前两篇文章中，对JobSchedulerService的启动和Job的调度过程大致做了个梳理，通过前几篇的分析我们知道，要使得客户端Job被JSS调度执行，必须满足该Job在创建时所设置的约束，而这些约束何时满足，这将由StateController进行控制，本篇中将对所有StateController类的控制流程进行分析。...]]></description><category></category></item><item><title><![CDATA[Android 9.0 JobScheduler(三) 从Job的创建到执行]]></title><link>https://blog.csdn.net/FightFightFight/article/details/86632061</link><guid>https://blog.csdn.net/FightFightFight/article/details/86632061</guid><author>FightFightFight</author><pubDate>Thu, 24 Jan 2019 19:30:08 +0800</pubDate><description><![CDATA[上一篇文章：JobScheduler(二)——JobScheduler框架介绍及JSS的启动
现在来看看Job的添加流程，当应用程序通过JobScheduler.schedule(jobinfo)添加一个Job，到它最终完成调度，这个过程是怎样的呢？现在就来看看这个过程。
首先来看其时序图：

受限于图片大小，以上时序图中对一些流程进行了省略，只画出了重要的步骤，不过所有的步骤，都会在下面的内容分...]]></description><category></category></item><item><title><![CDATA[Android 9.0 JobScheduler(二) JobScheduler框架结构简述及JobSchedulerService的启动]]></title><link>https://blog.csdn.net/FightFightFight/article/details/86631763</link><guid>https://blog.csdn.net/FightFightFight/article/details/86631763</guid><author>FightFightFight</author><pubDate>Thu, 24 Jan 2019 19:16:27 +0800</pubDate><description><![CDATA[上一篇文章：JobScheduler(一)——JobScheduler的使用
1.JobScheduler框架简述
在上一篇文章中，对怎样使用JobScheduler做了一个简单的总结，当客户端应用通过JobScheduler.schedule(JobInfo)方法将创建的Job发送给JobScheduler后，Framework层将完全负责它的启动、执行、完成等生命周期调度。从这篇文章开始，将对...]]></description><category></category></item><item><title><![CDATA[Android 9.0 JobScheduler(一) JobScheduler的使用]]></title><link>https://blog.csdn.net/FightFightFight/article/details/86240553</link><guid>https://blog.csdn.net/FightFightFight/article/details/86240553</guid><author>FightFightFight</author><pubDate>Mon, 14 Jan 2019 15:56:36 +0800</pubDate><description><![CDATA[1.JobScheduler简介
JobScheduler是一个系统提供的API，旨于在应用进程、而非系统进程内执行各种作业调度，其原理是启动通过bindservice的方式启动对应应用进程的service，并在Service中进行作业。在执行一个Job时，将会使得系统持有一个WakeLock锁，以防止系统休眠进入Suspend。
在创建一个作业时，会设置多个约束条件，比如可以指定特定的网络、是否...]]></description><category></category></item><item><title><![CDATA[Android 9.0 自动背光机制分析]]></title><link>https://blog.csdn.net/FightFightFight/article/details/85797336</link><guid>https://blog.csdn.net/FightFightFight/article/details/85797336</guid><author>FightFightFight</author><pubDate>Fri, 04 Jan 2019 20:19:45 +0800</pubDate><description><![CDATA[在android 9.0中，相比android 8.1而言，背光部分逻辑有较大的调整，这里就对android P背光机制进行完整的分析。
1.手动调节亮度
1.1.在SystemUI、Settings中手动调节
在界面(SystemUI)和Settings中拖动进度条调节亮度时，调节入口在BrightnessController中:
@Override
public void onChanged(...]]></description><category></category></item><item><title><![CDATA[[C++] IO总结]]></title><link>https://blog.csdn.net/FightFightFight/article/details/85397776</link><guid>https://blog.csdn.net/FightFightFight/article/details/85397776</guid><author>FightFightFight</author><pubDate>Mon, 31 Dec 2018 23:28:58 +0800</pubDate><description><![CDATA[C++中的IO库提供了用于输入输出的各种流，除此之外还提供了管理流和缓冲区等功能。IO库结构如下图所示:


相同颜色的类位于同一个头文件中


ios_base:表示流的基本特征;
ios:继承于ios_base,提供了一个指向streambuf的指针;
streambuf:为缓冲区提供了内存，并提供了用于操作缓冲区的方法;
istream:继承于ios类，提供了输入方法;
ostream:继承...]]></description><category></category></item><item><title><![CDATA[[C++] 异常]]></title><link>https://blog.csdn.net/FightFightFight/article/details/85122895</link><guid>https://blog.csdn.net/FightFightFight/article/details/85122895</guid><author>FightFightFight</author><pubDate>Wed, 26 Dec 2018 17:26:38 +0800</pubDate><description><![CDATA[1.抛出异常
抛出一个异常，使用throw关键字，如：
double divide(int i, int j) {
	if (j == 0) {
		throw &amp;amp;quot;除数不能为0！&amp;amp;quot;;
	}
	return i / j;
}

当执行到一个throw时，其后面的语句将不再执行。
2.捕获异常
如果程序中有异常抛出，则需要对异常进行捕获，通过try...catch语句，如：
#include &amp;amp;amp;lt;...]]></description><category></category></item><item><title><![CDATA[[C++]智能指针unique_ptr,shared_ptr,weak_ptr]]></title><link>https://blog.csdn.net/FightFightFight/article/details/85252350</link><guid>https://blog.csdn.net/FightFightFight/article/details/85252350</guid><author>FightFightFight</author><pubDate>Tue, 25 Dec 2018 18:29:24 +0800</pubDate><description><![CDATA[C++中对于动态内存的使用非常严格，一次申请必须对应一次释放，否则将造成内存泄漏。这也要求程序员格外小心，比如如下示例:
void getStr() {
    std::string * pstr = new std::string();//pstr为局部变量
    *pstr = &quot;Hello world&quot;;
    ....
    return;
}

当该方法执行完毕后，局部变量pst...]]></description><category></category></item><item><title><![CDATA[[C++] 类型转换符static_cast、const_cast、dynamic_cast、reinterpret_cast]]></title><link>https://blog.csdn.net/FightFightFight/article/details/85221595</link><guid>https://blog.csdn.net/FightFightFight/article/details/85221595</guid><author>FightFightFight</author><pubDate>Sun, 23 Dec 2018 12:12:23 +0800</pubDate><description><![CDATA[C++中为了避免松散的、无意义的类型转换，添加了四个类型转换操作符，以更严格地限制类型转换：static_cast，const_cast，reinterpret_cast，dynamic_cast，下面逐一看看他们的使用。
static_cast
用隐式转换、或者用户定义转换的组合在类型间的转换，可以使用static_cast，该运算符语法格式如下:
static_cast&amp;amp;lt;type-nam...]]></description><category></category></item><item><title><![CDATA[[C++] 友元函数和友元类]]></title><link>https://blog.csdn.net/FightFightFight/article/details/84888476</link><guid>https://blog.csdn.net/FightFightFight/article/details/84888476</guid><author>FightFightFight</author><pubDate>Fri, 07 Dec 2018 22:48:48 +0800</pubDate><description><![CDATA[c++中对类的访问通过访问修饰符进行控制，类对象不能访问private和protected(子类中可以)修饰的变量和函数。有时候这种限制过于严格，因此，C++提供了另一种形式的访问权限——友元。
1.友元函数
通过让函数成为类的友元，可以赋予该函数与类的成员函数相同的访问权限。可以将友元理解为“类的好朋友”。简单来说，一个类的友元可以访问其私有属性和方法。
1.2.创建友元函数

Step1.创建...]]></description><category></category></item><item><title><![CDATA[[C++] 继承和动态内存管理]]></title><link>https://blog.csdn.net/FightFightFight/article/details/84657437</link><guid>https://blog.csdn.net/FightFightFight/article/details/84657437</guid><author>FightFightFight</author><pubDate>Fri, 30 Nov 2018 16:10:58 +0800</pubDate><description><![CDATA[在继承中，需要特别注意对动态内存的处理，当操作基类和派生类对象时，如果管理不当，就会造成如内存的二次释放、派生类内存未释放等问题。申请内存时需要在构造函数(尤其是拷贝构造函数)、赋值运算符中使用new来申请，在释放内存时则需要在析构函数中使用delete释放。
下面就来看看继承中和如何合理地通过拷贝构造、赋值运算符、析构函数来管理动态内存。
1.基类中未使用动态内存分配，派生类中未使用动态内存分配...]]></description><category></category></item><item><title><![CDATA[[C++] 继承、虚函数、纯虚函数、虚基类]]></title><link>https://blog.csdn.net/FightFightFight/article/details/84607565</link><guid>https://blog.csdn.net/FightFightFight/article/details/84607565</guid><author>FightFightFight</author><pubDate>Thu, 29 Nov 2018 07:28:00 +0800</pubDate><description><![CDATA[1.继承
1.1.继承语法格式
要实现继承，遵循如下语法格式：
class SubClass : [public/protected/private] SuperClass
{ 
  //... 
};

其中SubClass称为派生类或子类，SuperClass称为基类或父类。
冒号之后的访问修饰符的作用如下：

1.public表示公有继承，基类的公有成员将成为派生类的共有成员，基类的私有部分...]]></description><category></category></item><item><title><![CDATA[[C++] 拷贝构造函数和浅拷贝问题]]></title><link>https://blog.csdn.net/FightFightFight/article/details/84557876</link><guid>https://blog.csdn.net/FightFightFight/article/details/84557876</guid><author>FightFightFight</author><pubDate>Mon, 26 Nov 2018 23:29:57 +0800</pubDate><description><![CDATA[1.拷贝构造函数
当使用一个对象来初始化另一个同类对象时，编译器将自动生成一个构造函数，这个构造函数称为拷贝构造函数，其格式如下：
CustomClass(const CustomClass &amp;amp;amp;amp;amp; obj);

在之前说过，创建类时，如果没有提供构造函数，那么编译器将会自动提供一个默认的构造函数。
拷贝构造函数也是一样，如果没有提供拷贝构造函数，那么编译器将会提供一个默认的拷贝构造函数。
1...]]></description><category></category></item><item><title><![CDATA[[C++] 运算符重载]]></title><link>https://blog.csdn.net/FightFightFight/article/details/84401724</link><guid>https://blog.csdn.net/FightFightFight/article/details/84401724</guid><author>FightFightFight</author><pubDate>Fri, 23 Nov 2018 18:11:27 +0800</pubDate><description><![CDATA[1.为何需要重载运算符
自定义的类，不支持常用的操作符号，如果需要使用一些操作符，则该类必须对相应的操作符进行重载。
如自定义类Person:
#include &amp;amp;lt;string&amp;amp;gt;
class Person
{
    private:
        int m_age;
        std::string m_name;
    public:
        Person(in...]]></description><category></category></item><item><title><![CDATA[[C++]类总结]]></title><link>https://blog.csdn.net/FightFightFight/article/details/84332168</link><guid>https://blog.csdn.net/FightFightFight/article/details/84332168</guid><author>FightFightFight</author><pubDate>Wed, 21 Nov 2018 23:41:58 +0800</pubDate><description><![CDATA[1.类基础

1.1.类的声明
一般的习惯是，类的声明和定义分别在头文件和源文件中进行，声明一个类时，使用关键字class,语法如下：
//Person.h
#include &amp;amp;amp;amp;lt;string&amp;amp;amp;amp;gt;
class Person {
    
    private:
        int age;
        std::string name;
    public:
        s...]]></description><category></category></item><item><title><![CDATA[[C++]namespace和using关键字]]></title><link>https://blog.csdn.net/FightFightFight/article/details/84315883</link><guid>https://blog.csdn.net/FightFightFight/article/details/84315883</guid><author>FightFightFight</author><pubDate>Wed, 21 Nov 2018 11:21:51 +0800</pubDate><description><![CDATA[1.什么是名称空间
一个用于声明名称的区域。
2.作用
一个名称空间的名称不会与另一个名称空间中相同名称发射给你冲突，从而可以避免名称冲突。
3.创建名称空间
使用关键字namespace创建，如：
namespace MySpace{
    int age;
    double weight;
    ...
}

可以对名称空间进行嵌套：
namespace MySpace{
    in...]]></description><category></category></item></channel></rss>