手机网站开发视频seo培训优化
- 作者: 五速梦信息网
- 时间: 2026年04月20日 08:46
当前位置: 首页 > news >正文
手机网站开发视频,seo培训优化,凡科互动官网登录入口网页版,企业网站关键词优化排名应该怎么做shared_from_this 使用分析 场景 类的成员函数需要获取指向自身的shared_ptr的时候类成员函数传递shared_ptr给其他函数或者对象的时候#xff0c;目的是为了管理对象生命周期使用方法 首先类必须继承 std::enable_shared_from_thisT必须使用 shared_from_this 获取指…shared_from_this 使用分析 场景 类的成员函数需要获取指向自身的shared_ptr的时候类成员函数传递shared_ptr给其他函数或者对象的时候目的是为了管理对象生命周期使用方法 首先类必须继承 std::enable_shared_from_thisT必须使用 shared_from_this 获取指向自身的shared_ptr #includeiostream #includememoryusing namespace std;class MyClass :public std::enable_shared_from_thisMyClass { public:void show(){cout MyClass : show 运行 endl;}//返回一个shared_ptr指向自身std::shared_ptrMyClass getSharedPtr(){return shared_from_this();}//获取shared_Ptr然后调用它void process(){std::shared_ptrMyClass ptr shared_from_this();Funcaion(ptr);}void Funcaion(std::shared_ptrMyClassptr){cout 函数内部传入的shared_ptr指针使用次数 ptr.use_count() endl;ptr-show();} };int main() {//创建一个指向Myclass的share_ptr指针std::shared_ptrMyClass obj std::make_sharedMyClass();//调用类内成员函数获取shared_ptr自身std::shared_ptrMyClass selfptr obj-getSharedPtr();//验证shared_ptr的使用次数cout shared_ptr use_count: selfptr.use_count() endl;//cout obj.use_count() endl;//两个指针都可以调用类内成员函数验证obj-process();selfptr-process(); } 左值和右值 左值表达式的结果是一个持久对象也就是该值可以取地址内存区域是确定的。左值通常出现在赋值操作符左侧的值 右值 表达式的结果是一个临时值不可以取地址通常是赋值操作符右侧的数值 左值引用利用表示引用的类型可以绑定到左值 右值引用表示的引用类型目的是操控临时对象减少拷贝临时对象而产生性能消耗 移动语义也就是不用复制对象直接将资源进行移动即可减少性能消耗 #include iostream #include vectorstd::vectorint createVector() {std::vectorint temp {1, 2, 3};return temp; // 返回的是一个右值 }int main() {std::vectorint vec createVector(); // 这里使用移动语义for(int i : vec) {std::cout i ;}return 0; } 左值转换成右值场景分析 当左值出现在赋值运算符右侧的时候会自动将其转化为右值当左值作为算法的数时会自动将其转换为右值左值作为参数的时候传递给一个按值传递的函数时候会自动转换为右值 注意转换过程中左值本身是没有消失的而是生成了一个右值表示左值所指向的信息后面的代码会验证 #include iostreamint main() {int a 10; // a 是一个左值int b a; // 这里发生了左值到右值的转换a 的值10被赋给 bstd::cout a: a std::endl; // a 是左值std::cout b: b std::endl; // b 是左值打印出来的值是 10int* p a; // 获取 a 的地址std::cout Address of a: p std::endl;return 0; } 引用折叠 作用复杂引用类型中确定最终的引用类型是什么规则总结 T 变为 TT 变为 TT 变为 TT 变为 T 特点只有双时最终才是剩下情况都是 事例分析完美转发 功能将一个参数完整的转发给另一个函数也就是说不改变值的类型原本是左值就还是左值右值还是右值。具体理解看函数实现吧具体实现结合引用折叠规则必须传入左值当T被推导的时候就是 最终得到的也就是 #include iostream #include utility // for std::forward// 接受左值引用 void process(int x) {std::cout 左值引用: x std::endl; }// 接受右值引用 void process(int x) {std::cout 右值引用: x std::endl; }// 用于完美转发 template typename T void forwarder(T arg) {process(std::forwardT(arg)); }int main() {int a 10;forwarder(a); // 调用 process(int) - 传递左值forwarder(20); // 调用 process(int) - 传递右值forwarder(std::move(a)); // 调用 process(int) - 传递右值return 0; } std::move 使用方法 将一个对象的所有权从一个地方转移到另一个地方本质是移动而不是复制资源实现原理结合函数原型理解 模板参数类型是万能引用所以可以根据传入的参数类型T可以是任意的成为左值引用或者右值引用remove_reference是类型萃取主要是用于去除T的引用无论是左值引用还是右值引用最终都变成原型static_cast将参数显式的转换为右值引用也就是说即使传递的是一个左值move最终也会将其变成一个右值 C指针 指针和引用的区别 指针是一个存储地址的变量可以为空同样也可以重新指向不同的对象也可以进行指针算术运算引用则是一个对象的别名必须在声明的时候初始化不可以重新绑定更不可以为空使用场景不同 指针常用在需要动态分配内存或者需要表示未初始化状态的时候引用则是需要传递函数参数避免大量复制数据或者函数返回的时候避免造成内存消耗 重要的区别如下 函数指针 参数说明参考下面函数指针定义一同理解 return_type函数返回的类型pointer_name指针变量名称可以理解为就是函数名parameter_list函数的参数列表具体使用参考下面的类型 函数指针数组 #include iostream int add(int a, int b) {return a b; }int subtract(int a, int b) {return a - b; }int multiply(int a, int b) {return a * b; }int main() {// 创建一个函数指针数组int (*operations[3])(int, int) { add, subtract, multiply };int a 10, b 5;for (int i 0; i 3; i) {std::cout Result: operationsi std::endl;}return 0; }可以使用typedef简化函数指针的声明和使用 typedef int (*Operation)(int, int);int add(int a, int b) {return a b; }int multiply(int a, int b) {return a * b; }int main() {Operation op;op add;std::cout Add: op(5, 3) std::endl;op multiply;std::cout Multiply: op(5, 3) std::endl;return 0; }函数的三种传递方式值传递、引用传递、指针传递 值传递 含义在使用值传递的时候函数收到的参数是一个拷贝后的数据函数内部无论对形参做什么操作都不会影响原始变量的数值特点 首先是不会改变原始变量的数值适用于传输比较小的数据类型 void modifyValue(int x) {x 20; // 仅修改了局部变量 x 的值 }int main() {int a 10;modifyValue(a);std::cout a: a std::endl; // 输出 10a 未被修改return 0; }引用传递 含义函数接收的是变量引用如果对该引用进行修改会影响到之前的原始变量特点 在传递数据的时候不需要复制对象从而可以减少性能消耗 void modifyValue(int x) {x 20; // 修改了原始变量的值 }int main() {int a 10;modifyValue(a);std::cout a: a std::endl; // 输出 20a 被修改return 0; } 指针传递 含义函数中接受的参数是一个地址函数内可以通过对该地址解应用从而修改原始变量的数值特点 使用之前需要进行指针安全性检查防止空指针可以改变原始变量的数值 void modifyValue(int* x) {if (x ! nullptr) {*x 20; // 通过指针修改原始变量的值} }int main() {int a 10;modifyValue(a);std::cout a: a std::endl; // 输出 20a 被修改return 0; }迭代器 迭代器的含义与作用 含义STL库中提供的一种访问遍历容器中数据的通用方法作用 遍历容器提供一种统一的方法去遍历各种容器不需要关注容器的底层实现细节访问元素通过迭代器可以访问容器中的元素堆目标元素进行读取和修改插入和删除特定位置的元素插入和删除操作 迭代器类型 输入迭代器只读访问单向移动用于一次性读取输入输出迭代器写访问用于输出操作前向迭代器读写访问但是只支持单向移动双向迭代器读写访问支持双向移动 野指针和悬空指针 野指针 含义未被释放的指针或者已经被释放了内存但是没有被设置为NULL的指针未初始化的指针指针在声明的时候如果没有初始化那么指针指向的位置是不可控的所以会造成野指针内存释放但是指针没有置为NULL因此该指针还是指向那片被释放的内存但是该内存已经被释放所以成为了野指针野指针的危害 访问未定义的内存有可能引起程序崩溃无法预料指针的行为可能指向重要的内存区域从而导致数据破坏 悬空指针 含义指针指向已经被释放或者不再有效的内存位置的指针产生原因 内存释放后继续使用该指针指向的内存已经被释放了但是该指针仍然时被继续使用的局部变量的作用域指向局部变量的指针在该局部变量作用域结束后继续使用结合事例理解悬空指针的危害 悬空指针会导致对无效内存的访问这样会导致程序崩溃或者未定义的行为也有可能会覆盖其他数据破坏数据的完整性 四种强制类型转换 static_cast相同类型之间进行转换 特点 编译时会进行类型检查运行时不会进行类型检查向下转换时需要注意结合事例理解向下转换 dynamic_cast多态中进行类型转换比如基类到派生类 特点 运行是会进行类型检查会确保转换的安全性只有当基类有虚函数的时候才会有效注意转换失败时会返回空指针或者抛出异常 const_cast主要用于移除const或者volatile属性或者是为非const变量添加这些属性 特点 只可以改变const和volatile属性不可以用于其他类型的转换不会改变底层的数据结构 reinterpret_cast用于任何类型的转化该转换不会进行任何检查使用的时候需要注意转换的安全性和正确性 特点 限制少可以用于任何类型的转换没有类型检查不保证其安全性可能会存在未定义的行为 类型萃取 含义利用模版的特定根据传入的不同参数判断其不同的类型主要是用于STL中的一种技术比较复杂该处不深究应用场景 泛型编程根据类型特性进行不同的处理从而提高代码的通用性和灵活性类型安全检查编译期间进行类型检查从而避免运行时的错误从而提高程序的安全性基础类型萃取 std::is_integralT判断类型T是否为整型。std::is_floating_pointT判断类型T是否为浮点型。std::is_pointerT判断类型T是否为指针类型根据下面事例进一步理解 结构体相等判断方法分析 结构体逐个成员进行比较粗暴直接的比较每一个成员是否相等 struct MyStruct {int a;float b;std::string c; };bool areEqual(const MyStruct lhs, const MyStruct rhs) {return lhs.a rhs.a lhs.b rhs.b lhs.c rhs.c; } 重载比较运算符利用运算符重载从而判断两个结构体是否相等 struct MyStruct {int a;float b;std::string c;bool operator(const MyStruct other) const {return a other.a b other.b c other.c;} }; 使用标准库函数memcmp只适用于简单的数据类型结构体中如果出现指针等就不可以 #include cstringstruct MyStruct {int a;float b; };bool areEqual(const MyStruct lhs, const MyStruct rhs) {return std::memcmp(lhs, rhs, sizeof(MyStruct)) 0; } 拓展直接使用Boost库可以实现两个结构体比较 #include boost/fusion/include/adapt_struct.hpp #include boost/fusion/include/equal_to.hppstruct MyStruct {int a;float b;std::string c; };BOOST_FUSION_ADAPT_STRUCT(MyStruct, a, b, c)bool areEqual(const MyStruct lhs, const MyStruct rhs) {return boost::fusion::equalto(lhs, rhs); } C常用的四种模板简述 函数模板 定义一个通用的函数函数可以根据指定的类型来推导 类模板定义一个类的通用版本类的类型参数可以在实例化的时候再进行指定 别名模板给模板起一个别名让模版更加方便的使用 变量模板用于定义可以接受任何类型参数的常量很少用 switch语句的case分支是否可以直接定义变量分析 结果不可以会导致异常编译错误原因因为switch语句中所有的case标签共享同一个作用域不声明其作用域会造成命名冲突解决在case后面加一对{}来创建一个新的作用域就可以了 #include iostreamvoid example(int n) {switch (n) {case 1:int a 10; // 定义变量 astd::cout Case 1: a std::endl;break;case 2:int b 20; // 这里也定义了变量 bstd::cout Case 2: b std::endl;break;default:std::cout Default case std::endl;} }int main() {example(1);example(2);return 0; }#include iostreamvoid example(int n) {switch (n) {case 1: {int a 10; // 在新的作用域中定义变量 astd::cout Case 1: a std::endl;break;}case 2: {int b 20; // 在新的作用域中定义变量 bstd::cout Case 2: b std::endl;break;}default:std::cout Default case std::endl;} }int main() {example(1);example(2);return 0; }可变参数模版 含义C11的一种新模板特性允许定义任意数量的参数使用具体参考代码事例理解 函数模版中可变参数模板的使用事例 #include iostream// 基础情况不接受任何参数时终止递归 void print() {std::cout std::endl; }// 可变参数模板函数 template typename T, typename… Args void print(T first, Args… args) {std::cout first ;print(args…); // 递归调用 }int main() {print(1, 2, 3.5, hello, A);return 0;#include iostream// 基础情况没有参数时返回0 int sum() {return 0; }// 可变参数模板函数 template typename T, typename… Args int sum(T first, Args… args) {return first sum(args…); // 递归调用 }int main() {std::cout sum(1, 2, 3, 4, 5) std::endl; // 输出: 15return 0; } 类模板的可变参数 #include iostream #include string// 基础情况空的元组 template typename… Values class Tuple;// 可变参数模板类 template typename Head, typename… Tail class TupleHead, Tail… : private TupleTail… { public:Tuple(Head head, Tail… tail) : TupleTail…(tail…), head(head) {}Head head() const { return head; }const TupleTail… tail() const { return *this; }private:Head head; };// 终止递归的空元组特化 template class Tuple {};int main() {Tupleint, double, std::string t(42, 3.14, hello);std::cout t.head() std::endl; // 输出: 42std::cout t.tail().head() std::endl; // 输出: 3.14std::cout t.tail().tail().head() std::endl; // 输出: helloreturn 0; }
- 上一篇: 手机网站开发计划怎样做网站宣传
- 下一篇: 手机网站开发外文文献phpcms 网站栏目
相关文章
-
手机网站开发计划怎样做网站宣传
手机网站开发计划怎样做网站宣传
- 技术栈
- 2026年04月20日
-
手机网站开发步骤软件阿里云搭建网站教程
手机网站开发步骤软件阿里云搭建网站教程
- 技术栈
- 2026年04月20日
-
手机网站开发标准品牌学习网站
手机网站开发标准品牌学习网站
- 技术栈
- 2026年04月20日
-
手机网站开发外文文献phpcms 网站栏目
手机网站开发外文文献phpcms 网站栏目
- 技术栈
- 2026年04月20日
-
手机网站开发项目wordpress微信打赏功能添加
手机网站开发项目wordpress微信打赏功能添加
- 技术栈
- 2026年04月20日
-
手机网站开发怎么样移动互联网应用程序指的是什么
手机网站开发怎么样移动互联网应用程序指的是什么
- 技术栈
- 2026年04月20日
