临时对象与C++11右值引用
右值:不可取地址的值是右值。左值:可以取地址就是左值。
--------------------------------------
临时对象:
-----------------
临时对象的特性:
--------------------
系统不分配地址,在下一行就销毁了。
-------------------------------------------
临时对象的作用:
---------------------
主要为了完成数据传递的。
----------------------------------右值引用的语法形式:
--------------------------------
类型&& 变量名 = 右值(常量)
------------------------------------------Person&& p = Stu("lisi",23,1003);
------------------------------------------------
右值引用的作用,是用来引用右值,
底层是引用右值在栈上的一个临时变量,这栈上临时变量的别名。
右值引用只能引用右值或常量,不能引用左值。-------------------------------------------------------
如果引用左值的话,请使用移动语义函数:
------------------------------------------------------
std::move(左值)
----------------------------Person&& p2 = move(p);p2.showInfo();
--------------------------------
C++11新特性:移动构造
移动构造的意义:
---------------------------------
C++11的移动构造是C++中拷贝构造一种强有力的补充
----------------------------------------------------------------语法形式:
-------------------
class 类名
{类名(类型&& other){}
};
-------------------------------------
A(const A& other){this->p = new int[1024]();memcpy(this->p,other.p,sizeof(int[1024]));cout << "A的拷贝构造" << endl;}A(A&& other){this->p = other.p;other.p = nullptr;cout << "A的移动构造" << endl;}
------------------------------------------------------
C++11新特性:匿名函数对象Lambda表达式
Lambda表达式的整体形式:
----------------------------------[]()->返回值{lamda表达式的函数体;
};-----------------------------------#include <iostream>
#include <typeinfo>
using namespace std;
template <class T>
class A
{
private:T& _t;
public:A(const T& t): _t(t){}void operator()(const string& str)const{cout << str << endl;}
};int main()
{[](const string& str){cout << str << endl;}("Hello World!!!!");auto f = 10;cout << typeid (f).name() << endl;auto f1 = [](){};cout << typeid (f1).name() << endl;auto f2 = [](const string& str){ cout << str << endl;};int x = 100;int y = 200;cout << "x外部的地址:" << &x << endl;auto f3 = [=]()mutable{int temp = x;x = y;y = temp;cout << "x的λ的内部地址:" << &x << endl;};f3();cout << "x = " << x << endl;cout << "y = " << y << endl;return 0;
}
-------------------------------------使用Lambda表达式来做为比较算法的算法策略:
----------------------------------------------------------#include <iostream>
using namespace std;
template <class T, class Function>
T compair(T t1, T t2, Function f)
{return f(t1,t2);
}int main()
{cout << compair(10,15,[](int val1, int val2){return val1 < val2 ? val1 : val2;}) << endl; cout << "----------------------------------" << endl;cout << compair(10,15,[](int val1, int val2){return val1 > val2 ? val1 : val2;}) << endl; return 0;
}----------------------C++中的闭包:(了解即可)函数内部嵌套了lambda表达式
--------------------------------#include <iostream>
using namespace std;
template <class T>
auto add(T t1, T t2)->T
{return [&](T t1, T t2){return t1 + t2;}(t1,t2);
}
int main()
{cout << add(10,10) << endl;return 0;
}
C++中的异常处理机制
C++异常处理的套路:
----------------------------
1.使用throw关键字,在有可能出现异常的地方抛出异常,异常可以使用一个常量,字符串,自定义的类对象,C++标准库的异常对象。
-----------------------------------
在抛出异常过程中,如果外层嵌套函数没有处理,那么,这个抛出的异常会继续向外层抛出,直到main函数,如果main主函数也没有处理,那么程序将自动中止。
---------------------------------2.在最外层的接口中使用try{....}catch(表达式){....}语句捕获异常,并处理。
------------------------------
注意:try{....}catch(表达式){....}语句块是一个整体不能拆开。
--------------------------------------------------------------------
try{把有可能抛出异常的函数,对象,放在try语句块中,用来捕获可能出现的异常。}catch(Exception 对象)
{
}
C++工厂设计模式
工厂模式(多态的应用):即创建型设计模式:
----------------------------------------------
在需要创建大量对象的场景下,
使用工厂:
-----------------------
工厂设计模式包括了以下几种方式:
--------------------------------------------------
1.简单工厂:Simple Factory Method
--------------
2.静态工厂:static Factory Method
---------------------
3.抽象工厂:Abstract Factory
---------------
工厂设计模式的意义:
-----------------------------
提高代码的维护性与可拓展性。
--------------------
在开发时,如果需要大量地创建对象时,就应该去为创建类对象去实现一个工厂类。--------------------------------------------
以上就是我们普通工厂方法的代码的实现,但是普通工厂代码还不够优秀,假设如果我们在传入字符串时,不小心手抖写错了一个字母:那和程序就会异常中止了。
-------------------------------
所以为了避免因为后期维护时,其它程序员手抖而造成空指针异常中止的问题,我们把生产方法优化为多个指定的生产方法,优化生产方法:多个工厂方法
------------------------------------
把原来的普通工厂方法中的多个分支,分别实现多个工厂生产方法:抽象工厂(Abstract Factory):
-------------------------------------
不要随便去修改源代码,公司已经通过测试过的代码,所以我在一开始设计时,就应该避免后期使用时的多次修改多次测试的问题。所以就有了抽象工厂