auto
//C++14自動推理返回值
//C++11 需要返回->指定類型
auto (*f)() -> int(*)();
//f是什么類型?
int(* (*fx)() )( ); //返回值是函數(shù)指針
auto pf(void) -> auto(*)(int x) -> int(*)(int a,int b)
{
//層級運轉方式: 從左往右
return nullptr;
}
//pf是什么類型?
// auto pf(void) -> auto(*)(int x) -> int(*)(int a,int b)
// int (* (* pf(void) )(int x) )(int a,int b)
// int (__cdecl* (__cdecl* __cdecl(void) )(int) )(int,int)
void main()
{
cout << typeid(pf).name() << endl;
cin.get();
}
模板別名
template<class T> using t = T;
template<class T> using tp = T*;
template<class T>
T show(T t1)
{
t<T> tx(t1);
tp<T>tp1(&tx);
cout << tx << " " << tp1 << endl;
return tx;
}
#include<array>
//模板別名 用別名優(yōu)化模板名稱 只能放在類 命名空間 全局 不能放在函數(shù)內部
template<class T1> using t1 = array<T1,10>;
template<class T, int n> using wu = array<T, n>;
void main01()
{
using intarry = array<int, 10>; //模板別名 明確類型
double a=10;
// cout << show(a) << endl;
t1<int> t11{ 1,2,3,4,5,6,7,8,9,10 };
for each (auto i in t11)
{
cout << i << endl;
}
wu<int, 10> t12{ 1,2,3,4,5,6,7,8,9,10 };
for each (auto j in t12)
{
cout << j << endl;
}
cin.get();
}
收縮轉換 constexpr inline
//收縮轉換
void main02()
{
//char ch0(7777) ; // 不保證結果的正確
//char ch1{ 7777 };// 保證數(shù)據類型安全轉換 越界編譯錯誤
cin.get();
}
//C++14 二進制
void main03()
{
int a = 0b1001; //0b 0B代表二進制
cout << a << endl; //9
cin.get();
}
//constexpr 標識返回值或者其他表達式是常量
constexpr int get()
{
return 5;
}
//inline
namespace all
{
//inline 展開在all 默認的版本
inline namespace V2015
{
}
}
lambda表達式
初級
//lambda表達式: 解決函數(shù)懷孕現(xiàn)在
void main04()
{
//[] {cout << "ssssss" << endl;}(); //匿名表達式 ()最后一個括號 起調用
// { } 函數(shù)體 執(zhí)行
auto fun = [] {cout << "sssss" << endl;}; //返回函數(shù)指針
fun(); //調用
[]{ cout << "xxxxxxx" << endl,cout << "ddddd" << endl; }();
//[]操作外部變量 ()參數(shù)列表 {}函數(shù)體 ()調用
[] (char*str){cout << str << endl;}("kkkkk"); //匿名
auto fun1 = [](char*str) {cout << str << endl;};
fun1("yyyyyy"); //lambda 不可以直接取地址 無法當作函數(shù)指針
auto fun2 = [](double a,double b)->int {return a+b;}; //指定返回值類型為int -> 在()和{}之間 指定返回類型
//內聯(lián)展開揭斧,無法取出地址
//->decltype(a+b) 自動推理類型
auto fun3 = [](double a, int b)->decltype(a+b){return a + b;};
fun3(10, 11); //遵循副本機制
cin.get();
}
高級
#include<array>
#include<algorithm> //算法頭文件
void main()
{
int num1 = 10;
int num2 = 11;
[=]() {cout << num1 << " " <<num2<< endl;}(); // = 只能讀外部變量 不能寫
[&]() {num1 = 50, num2 = 64, cout << num1 << " " << num2 << endl;}(); //& 讀寫外部變量
[=]()mutable {num1 = 50, num2 = 64, cout << num1 << " " << num2 << endl;}(); // = mutable 修改副本
int a = 10, b = 20, c = 30;
[&a, b, c]() {a = 111, cout << a << " " << b << " " << c << endl;}(); //[&a, b, c] 僅a可讀可寫 bc只可讀
//[a,b,c] mutable 讀原本 寫副本 =只能指定全部
//2015
[](auto a = 0, auto b = 0) {cout << a + b << endl;}(10.8,11); //C++14 推理數(shù)據類型 默認參數(shù)只能用=
array<int, 10> myint{1,2,3,4,5,6,7,8,9,10}; //CPP風格叔祖
for_each(myint.begin(), myint.end(), [](int num) {cout << num << endl;}); //顯示
for_each(myint.begin(), myint.end(), [&](int num) {num+=1,cout << num << endl;}); //修改
cin.get();
}
函數(shù)包裝器
#include<functional> //函數(shù)包裝頭文件
using std::function; //函數(shù)包裝器
void go()
{
cout << "go" << endl;
}
int add(int a, int b)
{
return a + b;
}
void main06x()
{
//返回值 參數(shù)
function<void(void)> fun1 = go;
fun1();
function<void(void)> fun2 = []() {cout << "go lambda" << endl;};
fun2();
function<int(int, int)> fun3 = add;
fun3(10,19);
cin.get();
}
模板元
int get50(int n)
{
if (n==1)
{
return 1;
}
else if(n==2)
{
return 2;
}
else
{
return get50(n - 2) + get50(n - 2);
}
}
//遞歸: 反復調用 函數(shù)等待 返回 浪費時間多
//模板元實現(xiàn)遞歸加速
//執(zhí)行速度快 編譯時候慢 代碼體積會增加
//模板元 只能處理常量 把代碼的運行時間放在了編譯的時間 C11
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 = 2 };
};
void main()
{
cout << data<40>::res << endl; //模板元 只能處理常量 把代碼的運行時間放在了編譯的時間
cout << get50(50) << endl;
cin.get();
}
const
//C語言const 只能避免直接 無法避免間接
//const 在*左邊 內容不能改變 在*右邊 地址不能改變
void run1(const int *p); //可以改變地址 不能改變內容
void run2(int const *p);
void run3(int* const p); //不可以改變地址 能改變內容
void run4(const int * const p); //bu可以改變地址 不能改變內容
void run5(int const * const p);
void main0xx7()
{
const int n = 10;
int a[n]{0}; //C++編譯器自動優(yōu)化 n替換為10
const int num = 10;
*(int*)(&num) = 3;
cout << (void*)&num << endl;
cout << *(&num) << endl; // 10 讀寄存器 自動優(yōu)化 強行替換為10
int a = 10;
//const int num1 = a;
*(int*)(&num1) = 3;
cout << (void*)&num1 << endl;
cout << *(&num1) << endl; // 3 直接讀內存 不作優(yōu)化
const int numa[5]{ 1,2,3,4,5 };
const int*p = numa;
*(int*)p = 100;
//const數(shù)組 沒有優(yōu)化 可以間接改變
//*(p+2)=1; 指向常量的指針 無法修改
cin.get();
}
智能指針
//智能指針 內存泄漏 自動管理內存
void autoptr()
{
while (1)
{
double *p(new double[1024 * 1024]);
auto_ptr<double>autop(p); //接管 自動回收
}
}
void autoptnew()
{
while (1)
{
unique_ptr<double> p(new double[1024 * 1024*10]); //
}
}
tuple
//多元數(shù)組 tuple 存取不同的數(shù)據類型
#include<tuple>
void main08x()
{
char ch = 'x';
short sh = 1;
int num = 22221;
double db = 123.1;
char*p = "calc";
tuple<char, short, int, double, char*> mytule(ch,sh,num,db,p);
auto autov = get<0>(mytule); //<> 里面只能是常量
cout << autov << endl;
cin.get();
}