<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Theonlyikun的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Theonlyikun</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Theonlyikun]]></copyright><item><title><![CDATA[包装器和适配器应用场景-如何取代虚函数]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150499096</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150499096</guid><author>Theonlyikun</author><pubDate>Mon, 18 Aug 2025 19:34:14 +0800</pubDate><description><![CDATA[虚函数在执行过程中会跳转两次（先查找对象的函数表，再次通过该函数表中的地址找到真正的执行地址），这样的话，CPU会跳转两次，而普通函数只跳转一次。为了管理的方便（基类指针可指向派生类对象和自动析构派生类），保留类之间的继承关系。每跳转一次，预取指令要作废很多，所以效率会很低。]]></description><category></category></item><item><title><![CDATA[包装器和绑定器应用场景-回调函数的实现]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150497356</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150497356</guid><author>Theonlyikun</author><pubDate>Mon, 18 Aug 2025 17:29:35 +0800</pubDate><description><![CDATA[在消息队列和网络库的框架中，当接收到消息（报文）时，回调用户自定义的函数对象，把消息（报文）参数传给它，由它决定如何处理。]]></description><category></category></item><item><title><![CDATA[包装器和绑定器应用场景-可变函数和参数]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150495257</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150495257</guid><author>Theonlyikun</author><pubDate>Mon, 18 Aug 2025 16:18:33 +0800</pubDate><description><![CDATA[写一个函数，函数的参数是函数对象及参数，功能和。]]></description><category></category></item><item><title><![CDATA[C++适配器bind]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150492171</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150492171</guid><author>Theonlyikun</author><pubDate>Mon, 18 Aug 2025 15:29:57 +0800</pubDate><description><![CDATA[意思是如果现有的函数类型与要求的函数类型不同，那么，可以用bind对现有的函数对象进行转换，生成新的函数对象，与要求的函数类型匹配。模板函数是一个通用的函数适配器（绑定器），它用一个可调用对象及其参数，生成一个新的可调用对象，以适应模板。：需要绑定的可调用对象（可以是前两节课介绍的那六种，也可以是。：绑定参数列表，可以是左值、右值和参数占位符。，如果参数不是占位符，缺省为值传递，]]></description><category></category></item><item><title><![CDATA[C++包装器function]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150491057</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150491057</guid><author>Theonlyikun</author><pubDate>Mon, 18 Aug 2025 14:31:32 +0800</pubDate><description><![CDATA[把不同形式的可调用对象（函数、成员函数、lambda、仿函数等）统一成一个接口，方便存储、传递和调用。是一个通用的可调用对象的包装器，用简单的、统一的方式处理可调用对象。运算符，用于判断是否包装了可调用对象。对象未包装可调用对象，使用。返回类型(参数列表)]]></description><category></category></item><item><title><![CDATA[可调用对象]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150484811</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150484811</guid><author>Theonlyikun</author><pubDate>Mon, 18 Aug 2025 11:44:39 +0800</pubDate><description><![CDATA[在C++中，可以像函数一样调用的有：普通函数、类的静态成员函数、仿函数、lambda函数、类的非静态成员函数、可被转换为函数的类的对象，统称可调用对象或函数对象。可调用对象有类型，可以用指针存储它们的地址，可以被引用（类的成员函数除外）]]></description><category></category></item><item><title><![CDATA[C++原子类型atomic]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150450457</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150450457</guid><author>Theonlyikun</author><pubDate>Sat, 16 Aug 2025 18:55:01 +0800</pubDate><description><![CDATA[比较原子变量的值和预期值expect，如果当两个值相等，把val存储到原子变量中，函数返回true；如果当两个值不相等，用原子变量的值更新预期值，函数返回false。原子操作由CPU指令提供支持，它的性能比锁和消息传递更高，并且，不需要程序员处理加锁和释放锁的问题，支持修改、读取、交换、比较并交换等操作。查询某原子类型的操作是直接用CPU指令（返回true），还是编译器内部的锁（返回false）。模板类的模板参数支持指针，但不表示它所指向的对象是原子类型。把val的值存入原子变量，返回原值。]]></description><category></category></item><item><title><![CDATA[C++ 条件变量-生产消费者模型]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150449892</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150449892</guid><author>Theonlyikun</author><pubDate>Sat, 16 Aug 2025 18:42:34 +0800</pubDate><description><![CDATA[条件变量是一种线程同步机制。当条件不满足时，相关线程被一直阻塞，直到某种条件出现，这些线程才会被唤醒。风格（在构造时获得锁，在析构时释放锁）。它们的区别在于：为了配合。循环的阻塞当前线程，直到通知到达且谓词满足。：是一种通用的条件变量，可以与任意。搭配（包括用户自定义的锁类型）。是模板类，模板参数为互斥锁类型。时间长度,Pred pred)阻塞当前线程，直到通知到达。时间点,Pred pred)都是管理锁的辅助类，都是。消费者进程会一直等待。通知一个等待的线程。通知全部等待的线程。]]></description><category></category></item><item><title><![CDATA[C++互斥锁 ]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150449836</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150449836</guid><author>Theonlyikun</author><pubDate>Sat, 16 Aug 2025 17:49:35 +0800</pubDate><description><![CDATA[C++11提供了四种互斥锁：mutex：互斥锁。：带超时机制的互斥锁。：递归互斥锁。：带超时机制的递归互斥锁。包含头文件：一、mutex类1）加锁lock()互斥锁有锁定和未锁定两种状态。如果互斥锁是未锁定状态，调用lock()成员函数的线程会得到互斥锁的所有权，并将其上锁。如果互斥锁是锁定状态，调用lock()成员函数的线程就会阻塞等待，直到互斥锁变成未锁定状态。2）解锁unlock()只有持有锁的线程才能解锁。3）尝试加锁try_lock()]]></description><category></category></item><item><title><![CDATA[C++11线程]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150443462</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150443462</guid><author>Theonlyikun</author><pubDate>Sat, 16 Aug 2025 17:16:18 +0800</pubDate><description><![CDATA[在C++11之前，C++没有对线程提供语言级别的支持，各种操作系统和编译器实现线程的方法不一样。C++11增加了线程以及线程相关的类，统一编程风格、简单易用、跨平台。]]></description><category></category></item><item><title><![CDATA[可变参数模板]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150442850</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150442850</guid><author>Theonlyikun</author><pubDate>Sat, 16 Aug 2025 11:05:46 +0800</pubDate><description><![CDATA[可变参数模版是C++11新增的最强大的特性之一，它对参数进行了泛化，能支持任意个数、任意数据类型的参数。]]></description><category></category></item><item><title><![CDATA[完美转发 ]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150442631</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150442631</guid><author>Theonlyikun</author><pubDate>Sat, 16 Aug 2025 11:01:46 +0800</pubDate><description><![CDATA[在函数模板中，可以将参数“完美”的转发给其它函数。所谓完美，即不仅能准确的转发参数的值，还能保证被转发参数的左、右值属性不变。标准引入了右值引用和移动语义，所以，能否实现完美转发，决定了该参数在传递过程使用的是拷贝语义还是移动语义。）如果模板中（包括类模板和函数模板）函数的参数书写成为。，那么，函数既可以接受左值引用，又可以接受右值引用。是一个右值，转发之后仍是右值引用；是一个左值，转发之后仍是左值引用。]]></description><category></category></item><item><title><![CDATA[移动语义 ]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150427148</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150427148</guid><author>Theonlyikun</author><pubDate>Fri, 15 Aug 2025 17:34:01 +0800</pubDate><description><![CDATA[左值对象被转移资源后，不会立刻析构，只有在离开自己的作用域的时候才会析构，如果继续使用左值中的资源，可能会发生意想不到的错误。深拷贝把对象中的堆区资源复制了一份，如果源对象（被拷贝的对象）是临时对象，拷贝完就没什么用了，这样会造成没有意义的资源申请和释放操作。C++11中，将拷贝数据的操作叫拷贝语义，而移动语义的意思是：不要拷贝，直接把资源转移过来，资源都是用指针指向的，把指针处理一下就可以转移资源，不用拷贝数据，所以转移资源的操作叫移动语义。实现移动语义要增加两个函数：移动构造函数和移动赋值函数。]]></description><category></category></item><item><title><![CDATA[右值引用 ]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150426154</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150426154</guid><author>Theonlyikun</author><pubDate>Fri, 15 Aug 2025 16:43:15 +0800</pubDate><description><![CDATA[但是，常量左值引用却是个奇葩，它可以算是一个万能的引用类型，它可以绑定非常量左值、常量左值、右值，而且在绑定右值的时候，常量左值引用还可以像右值引用一样将右值的生命期延长，缺点是，只能读不能改。中的引用很常见，就是给变量取个别名，在C++11中，因为增加了右值引用(rvalue reference)的概念，所以C++98中的引用都称为了左值引用(lvalue reference)。的返回值本来在表达式语句结束后其生命也就该终结了（因为是临时变量），而通过右值引用重获了新生，其生命周期将与右值引用类型变量。]]></description><category></category></item><item><title><![CDATA[lambda函数]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150424753</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150424753</guid><author>Theonlyikun</author><pubDate>Fri, 15 Aug 2025 16:26:52 +0800</pubDate><description><![CDATA[6、在lambda函数中，如果希望修改值捕获变量的值，可以加mutable选项，但是，在lambda函数的外部，变量的值不会被修改。2、用后置的方法书写返回类型，类似于普通函数的返回类型，如果不写返回类型，编译器会根据函数体中的代码推断出来。1、参数列表是可选的，类似普通函数的参数列表，如果没有参数列表，()可以省略不写。5、捕获列表书写在[ ]中，与函数参数的传递类似，捕获方式可以是值和引用。亲爱的" << no << "号：我是月月鸟\n";函数是C++11标准新增的语法糖，也称为。]]></description><category></category></item><item><title><![CDATA[委托构造和继承构造]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150423397</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150423397</guid><author>Theonlyikun</author><pubDate>Fri, 15 Aug 2025 15:31:05 +0800</pubDate><description><![CDATA[在实际的开发中，为了满足不同的需求，一个类可能会重载多个构造函数。例如变量初始化，如果在每个构造函数中都写一遍，这样代码会显得臃肿。推出了继承构造（Inheriting Constructor），在派生类中使用using来声明继承基类的构造函数。在C++11之前，派生类如果要使用基类的构造函数，可以在派生类构造函数的初始化列表中指定。委托构造就是在一个构造函数的初始化列表中调用另一个构造函数。一旦使用委托构造，就不能在初始化列表中初始化其它的成员变量。标准新增了委托构造和继承构造两种方法，用于简化代码。]]></description><category></category></item><item><title><![CDATA[C++11新标准]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150421342</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150421342</guid><author>Theonlyikun</author><pubDate>Fri, 15 Aug 2025 15:07:23 +0800</pubDate><description><![CDATA[三、原始字面量一、long long 类型新增了类型long long和unsigned long long，以支持64位（或更宽）的整型。在VS中，int和long都是4字节，long long是8字节。在Linux中，int是4字节，long和long long是8字节。二、新增了类型char16_t和char32_t，以支持16位和32位的字符。三、原始字面量原始字面量（值）可以直接表示字符串的实际含义，不需要转义和连接。语法：R"(字符串的内容)"]]></description><category></category></item><item><title><![CDATA[ C++断言]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150419146</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150419146</guid><author>Theonlyikun</author><pubDate>Fri, 15 Aug 2025 11:51:41 +0800</pubDate><description><![CDATA[包含头文件#include <cassert> 语法：assert(表达式);断言就是判断(表达式)的值，如果为0（false），程序将调用abort()函数中止，如果为非0（true），程序继续执行。C++11新增了静态断言static_assert，用于在编译时检查源代码一、断言断言（assertion）是一种常用的编程手段，用于排除程序中不应该出现的逻辑错误。使用断言需要包含头文件<cassert>或<assert.h>，头文件中提供了带参数的宏assert。]]></description><category></category></item><item><title><![CDATA[C++异常 ]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150417955</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150417955</guid><author>Theonlyikun</author><pubDate>Fri, 15 Aug 2025 11:37:25 +0800</pubDate><description><![CDATA[如果程序中抛出的异常没有被捕获，程序将异常中止1）捕获全部的异常try//可能抛出异常的代码。// throw异常对象;//不管什么异常，都在这里统一处理。2）捕获指定的异常try//可能抛出异常的代码。// throw异常对象;//发生exception1异常时的处理代码。//发生exception2异常时的处理代码。在try语句块中，如果没有发生异常，执行完try语句块中的代码后，将继续执行try语句块之后的代码；如果发生了异常，用throw。]]></description><category></category></item><item><title><![CDATA[随机存取 ]]></title><link>https://blog.youkuaiyun.com/Theonlyikun/article/details/150415706</link><guid>https://blog.youkuaiyun.com/Theonlyikun/article/details/150415706</guid><author>Theonlyikun</author><pubDate>Fri, 15 Aug 2025 10:32:14 +0800</pubDate><description><![CDATA[直接移动文件的位置指针，在指定位置读/写数据。注意Windows系统中文本文件的换行，写入数据的时候，系统会将"\n"转换成"\r\n"。文件的位置指针：对文件进行读/写操作时，文件的位置指针指向当前文件读/写的位置。end-文件的结尾位置。随机存取是指直接移动文件的位置指针，在指定位置读取/写入数据。（覆盖写，而不是插入），文件内容会在指针位置直接被修改。从文件开始的位置往后移30字节。从文件结尾的位置往前移10字节。把文件指针移到第128字节。把文件指针移动文件的开始。把文件指针移动文件的结尾。]]></description><category></category></item></channel></rss>