引用包装器 std::ref(变量)
#include<iostream>
template<class T>
void com(T arg)//模板函数,引用无效,引用包装器
{
std::cout <<"com ="<< &arg << "\n";
arg++;
}
void main()
{
int count = 10;
int & rcount = count;
com(count);
std::cout << count << std::endl;
//std::ref(变量) ,函数模板,引用包装器
//com(std::ref(count));
com(rcount);
std::cout << "main=" << &rcount << "\n";
std::cout << count << std::endl;
std::cin.get();
}
仿函数
引用内部函数绑定机制
#include<iostream>
#include<functional>//处理函数
using namespace std;
using namespace std::placeholders;
//仿函数,创建一个函数指针,引用一个结构体内部或者一个类内部的公有函数
struct MyStruct
{
void add(int a)
{
cout << a << endl;
}
void add2(int a,int b)
{
cout << a +b<< endl;
}
void add3(int a, int b,int c)
{
cout << a + b +c<< endl;
}
};
void main()
{
MyStruct struct1;
//创建函数指针,类结构体,数据私有,代码共享
//函数通过调用,调用需要传递对象名进行区分
void(MyStruct::*p)(int ) = &MyStruct::add;
cin.get();
}
int main1()
{
MyStruct struct1;
//auto自动变量,地址,函数指针,bind绑定
//第一个参数引用内部函数,绑定一个实体对象,
auto func = bind(&MyStruct::add, &struct1, _1);//一个参数
auto func2 = bind(&MyStruct::add2, &struct1,_1, _2);//二个参数
auto func3 = bind(&MyStruct::add3, &struct1, _1, _2,_3);//三个参数
func(100);
func2(10, 20);
func2(10, 20, 30);//只会接收前2个参数
func3(10, 20,30);
cin.get();
return 0;
}
转义字符 R”()”
#include <iostream>
#include<string>
#include<stdlib.h>
void main()
{
std::string path =R"( "C:\Program Files\Tencent\QQ\QQProtect\Bin\QQProtect.exe")";
//R"()" 括号之间去掉转义字符
system(path.c_str());
system("pause");
}
using别名
#include <iostream>
namespace space //隔离模板,避免冲突
{
template<class T> using ptr = T*;//模板的简写
}
int add(int a, int b)
{
return a + b;
}
typedef int(*ADD)(int a, int b);
using FUNC = int (*)(int a, int b);//别名
using co = std::ios_base::fmtflags;//using只可以用于简写数据类型
void main()
{
ADD p=add;
std::cout<<p(1, 2)<<std::endl;
FUNC func = add;
std::cout << func(1, 2) << std::endl;
//space::ptr<int> pint(new int(15));
//std::cout << *pint << " " << pint << std::endl;
std::cin.get();
}
模板元编程 比递归优化
#include<iostream>
//模板元把运行时消耗的时间,在编译期间优化
template<int N>
struct data
{
enum {res =data<N-1>::res+data<N-2>::res};
};
template<>
struct data<1>
{
enum {res =1};
};
template<>
struct data<2>
{
enum {res= 1 };
};
//递归 斐波那契数列
//1 1 2 3 5 8
int getdata(int n)
{
if (n==1 || n==2)
{
return 1;
}
else
{
return getdata(n - 1) + getdata(n - 2);
}
}
void main()
{
const int myint = 40;
int num = data<myint>::res;//<>内部不可以有变量
std::cout << num << std::endl;
std::cout << getdata(40) << std::endl;
std::cin.get();
}
//主要思想
//
//利用模板特化机制实现编译期条件选择结构,利用递归模板实现编译期循环结构,模板元程序则由编译器在编译期解释执行。
//
//优劣及适用情况
//
//通过将计算从运行期转移至编译期,在结果程序启动之前做尽可能多的工作,最终获得速度更快的程序。也就是说模板元编程的优势在于:
//
//1.以编译耗时为代价换来卓越的运行期性能(一般用于为性能要求严格的数值计算换取更高的性能)。通常来说,一个有意义的程序的运行次数(或服役时间)总是远远超过编译次数(或编译时间)。
//
//2.提供编译期类型计算,通常这才是模板元编程大放异彩的地方。
//
//模板元编程技术并非都是优点:
//
//1.代码可读性差,以类模板的方式描述算法也许有点抽象。
//
//2.调试困难,元程序执行于编译期,没有用于单步跟踪元程序执行的调试器(用于设置断点、察看数据等)。程序员可做的只能是等待编译过程失败,然后人工破译编译器倾泻到屏幕上的错误信息。
//
//3.编译时间长,通常带有模板元程序的程序生成的代码尺寸要比普通程序的大,
//
//4.可移植性较差,对于模板元编程使用的高级模板特性,不同的编译器的支持度不同。
智能指针
#include <iostream>
void main1()
{
//auto_ptr;
for (int i = 0; i < 10000000; i++)
{
double *p = new double;//为指针分配内存
std::auto_ptr<double> autop(p);
//创建智能指针管理指针p指向内存
//智能指针
//delete p;
}
std::cin.get();
}
C++11智能指针
#include<iostream>
#include<memory>//内存
void main()
{
for (int i = 0; i < 10000000;i++)
{
//新型指针,新型的数组
std::unique_ptr<double> pdb(new double);
//double *p = new double;
}
std::cin.get();
}
多线程
#include <thread>
#include<iostream>
#include<windows.h>
#include<vector>
using namespace std;
using namespace std::this_thread;
void msg()
{
MessageBoxA(0, "12345", "678910", 0);
}
void msgA(int num)
{
std::cout << get_id() << " num= " << num << std::endl;
}
void main1()
{
// thread::hardware_concurrency线程
auto n = thread::hardware_concurrency();
std::cout << n << std::endl;
//获取当前线程编号
std::cout << "thread=" << get_id() << std::endl;
thread thread1(msg);//创建多线程
thread thread2(msg);
thread1.join();//开始执行
thread2.join();
std::cin.get();
}
void main2()
{
vector<thread *> threads;
for (int i = 0; i < 10; i++)
{
threads.push_back(new thread(msg));//创建线程
}
for (auto th : threads)
{
th->join();
}
std::cin.get();
}
void main()
{
vector<thread *> threads;
for (int i = 0; i < 10; i++)
{
threads.push_back(new thread(msgA,i));//创建线程
}
for (auto th : threads)
{
th->join();
}
std::cin.get();
}
静态断言以及调试技能的要求 assert
#include <stdio.h>
#include<assert.h>
#include<iostream>
using namespace std;
#define N 10
void main()
{
int num = 100;
cout << num << endl;
cout << __FILE__ << endl;
cout << __LINE__ << endl;
cout << __DATE__ << endl;
cout << __TIME__ << endl;
cout << __FUNCTION__ << endl;
cin.get();
}
#define M
void main1()
{
char num = 10;
static_assert(sizeof(num) >= 1,"num valiued");
assert(num >= 4,"num>4");
//字节>4
#ifdef M
// static_assert(sizeof(num) >= 4, "yincheng error");
#endif
//调试代码,迅速代码错误在哪一行
}