美文网首页
2018-05-05

2018-05-05

作者: try312 | 来源:发表于2018-05-05 17:35 被阅读0次

CPP强弱类型

using namespace std;   //优化编译  没有用到的就不包含进来
// 泛型的概念 自动推理数据类型
//CPP类型检测严格 精准 属于强类型
int *p1(p2)               //() 初始化
for each (int i in a)   //遍历a所有的变量

宽字符本地化

#include<locale>
setlocale(LC_ALL,"zh-cn"); //宽字符本地化 
//C++重定向: >重写  >>追加       <  <<输入                       

函数模板

函数重载: 根据参数来识别
函数模板:

template<class T>
T add(T a, T b) {
    return a + b;
}

原生函数优先于模板函数 强行调用模板 add<int>(1,2)
调用的时候编译 不调用的时候不编译
函数模板意义: 通用 泛型

模板接口:

template<class T>
void show(T num) {   
   cout << num << endl;
}
//泛型接口  任何的数据类型 任何指针
template<class T, class F>
void run(T t, F f){
       f(t);
}
run("sss", show<const char*>);  //接口 严格类型

命名空间

命名空间的扩展: 名称相同 同一个命名空间

命名空间的权限:
using namespace data //使用命名空间 ,放在局部等同于局部变量 放在全局等同于全局变量
命名空间没有私有 ,全部变量,函数都是公有 可以访问
命名空间内部: 内层覆盖外层
// ::num 直接访问全局变量 全局变量不存在就是0
using namespace data //使用命名空间 必须在定义之后
//匿名命名空间等同于全局变量

命名空间深入:

namespace stdrun{
    int numl;
}
namespace bb = stdrun;  //别名

using  stdrun::numl;  //单独引用命名空间变量或者函数

一般情况下 函数实现放在命名空间之外 内部放声明

namespace stdfun
{
    struct Date
    {
        int getsub();
    };
}
int stdfun::Date::getsub() //命名空间::类型::函数名
{
    return a - b;
}

全局变量与局部变量

CPP没有声明与定义的差别

namespace data {
    int num = 100;
}
int main()
{
    int num = 10;
    using namespace data;  //局部变量覆盖命名空间
    cout << num << endl;
}
int num=100;
void main()
{
    int num=20;
    {
        int num=30;
        cout<<num<<endl; //局部覆盖   30
        cout<<num<<endl; //全局覆盖   100
   }
}

static_extern

extern int x ; //引用外部全局变量
static int a;   //作用于当前文件

static int x1 = 100;
namespace{
     int x1 = 90;
}
int main()
{
       //同一个文件下  ::引用的还是static
       //跨文件下     ::一般引用是全局
    cout << ::x1<< endl << endl;  //100
}

// ::优先级:    当前文件的stataic 再是跨文件的extern
// 匿名结构体等同于全局变量 可以跨文件       
// ::可以引用除匿名以外的全局变量 可屏蔽匿名

typeid (关键字)

用于获取数据类型

int b;
cout << typeid(b).name() << endl; //int
cout << typeid(10+1.2).name() << endl; //double
cout << typeid("guoshixian").name() << endl;//char const [11]
int *px;
char*py;
if (strcmp(typeid(px).name, typeid(py).name) == 0){
        cout << "==";
}
else{
    cout << "!=";
}

可变参数模板

类型一致

#include<cstdarg> //可变参数头文件

template<class T>
T add(int n, T t...) //第一个代表多少个参数  第二个代表多少类型列表
{
    cout << typeid(T).name() << endl;

    va_list arg_ptr; //开头指针
    va_start(arg_ptr, n); //从arg_ptr开始读取n个
    T res(0);       //初始化为0
    for (int i = 0; i < n; i++)
    {
        res += va_arg(arg_ptr, T);//根据数据类型 取出数据
    }
    va_end(arg_ptr);//结束读取
    
    return res;

}

int main()
{ 
    cout << add(4, 1, 2, 3, 4) << endl;
    cout << add(5, 1, 2, 3, 4,5) << endl;
    cout << add(4, 1.1, 2.2, 3.3, 4.4) << endl;

    cin.get();
    return 0;
}

类型不一致

#include<cstdarg> //可变参数头文件

void show() //空函数结束递归
{
}

//参数类型不一致 个数不确定
template<typename T , typename...Args> //typename...Args可变参数
void show(T t, Args...args)
{ 
    cout << t << endl;
    show(args...); //不能省略...
}

int main()
{
    show(1,2.1,'a',"ssssss");
    cin.get();
    return 0;
}

实习printf打印

#include<cstdarg> //可变参数头文件

void show(const char*str) //递归终止
{

}

//参数类型不一致 个数不确定
template<typename T, typename...Args> //typename...Args可变参数
void show(const char*str, T t, Args...args)
{
    while (str&&*str) //指针不为空 且字符串没到末尾
    {
        if (*str=='%'&&*(str+1)!='%')
        {
            ++str; //指针向前移动
            cout << t; //打印
            show(++str, args...); //继续调用

            return; //递归回调时 推出while循环
        }
        else
        {
            cout << *str++; //打印当前字符并且跳过一个字符
        }
    }

}

void main()
{
    printf("%d14555555%s%c%%%fXXXX",10,"1234",'0',1234.5);
    putchar('\n');
    show("%d14555555%s%c%%%fXXXX", 10, "1234", '0', 1234.5);

    cin.get();
}

默认参数: 外观模式

函数可以快速调用
省略参数
默认参数从右边开始,参数进栈,从右向左
不默认的参数 都在左边 默认右边

auto

自适应数据类型 自动推理

void main()
{
    int a[5] = { 5,2,3,4,5 };

    for (auto i : a)  //auto i 副本     auto&i 原本
    { 
        i += 1; //并没有改变数组元素原本  改变的是a[i]的副本
        cout << i << endl;  //6 3 4 5 6
    }

    cout  << endl;

    for (auto i : a)
    {
        cout << i << endl; //5,2,3,4,5 
    }

    for (auto &i : a)  //auto i 副本     auto&i 原本
    {
        i += 1; //auto&i  改变数组元素原本   等价于   a[i]+=1;
        cout << i << endl;  //6 3 4 5 6
    }
    cin.get();
}

bool

非0解析为1 , 0解析为0
一个字节大小

decltype 关键字

拷贝类型

template<class T>
void show(T*p)
{
    decltype(*p) num(*p); //内存备份

}
void main()
{
    int a = 3;
    //decltype(a)根据一个变量表达式获取类型  (拷贝类型)
    decltype(a) a1[5]{ 0 };
    for (auto i : a1)
    {
        cout << typeid(i).name() << "  " << i << endl;
    }

    cin.get();
}

CPP风格数组

//数组初始化两种方法:
//int a[5]{ 1,2,3,4,5 };
//int *p2(new  int[5]{ 1,2,3,4,5 });//CPP正式写法

void main()
{
    array<int, 10>myint1{ 1,2,3,4,5,6,7,8,9,10 }; //CPP风格数组
    array<int, 10>myint2{ 1,2,3,4,5,6,7,8,9,10 }; 
    array<int, 10>myint3{ 1,2,3,4,5,6,7,8,9,10 }; 

    array< array<int,10> , 3 > myint{ myint1,myint2,myint3}; //CPP风格二维数组
    for (auto i: myint)
    {
        for (auto j : i)
        {
            cout << j<< " ";
        }
        cout << endl;
    }

    cin.get();
 
}

CPP风格别名


//typedef 只能处理C语言
//typedef run runit;   //c风格 不能处理c++独有命名空间  函数模板等 类
//一般情况 原则用using 取代 typedef

typedef double DB;     //C风格别名
using DBCPP = double;  //CPP风格别名
namespace runit = run; //单独别名命名空间‘
#define INT int    //宏
 
typedef int a[10];   //C风格别名
using intarray = int[10];//CPP风格别名

typedef int(*p)(int a, int b); //函数指针类型
using pfun= int(*)(int a, int b);//CPP风格别名

typedef int(*pa[10])(int a, int b); //函数指针数组类型
using pafun = int(*[10])(int a, int b);//CPP风格别名

//typedef三步骤
//1 定义变量:    double DB;
//2 加typedef:   typedef double DB;
//3 DB就是double

//using三步骤
//1定义变量:       int num;
//2增加using INT=: using INT=int num;
//3去掉变量:       using INT=int

#include<functional>

namespace china{
    template<class T> using t = T;
        template<class T> using tp = T*;  //模板指针别名
        template<class T> 
        T show(T t1)
        {
                t<T> tx(t1);        //使用模板别名 必须明确其数据类型
                tp<int>tp1(&tx);

               cout << tx << "  " << tp1 << endl;

               return T;
       }
}

using std::function; //使用命名空间一部分
using fun = std::ios::fmtflags; //命名空间的类变量或者函数别名

void main()
{
    a a1;
    cin.get();
}

相关文章

  • 2018年5月7号开心学习一天

    2018-05-07 ty活出真善美 2018-05-05 22:11 · 字数 671 · 阅读 5 · 日记本...

  • MATLAB分布式并行计算中函数的使用

    2018-05-05 MATLAB分布式并行计算中函数的使用 1、parfor 函数 Execute for-lo...

  • 日精进打卡(第302天)

    2018-05-05 姓名:李义 公司:........ 组别:259期利他二组 【知~学习】 背诵 六项精进大纲...

  • 云南旅游攻略

    1.时间2018-04-30 ~ 2018-05-05 2018-04-30 去 2018-05-06 返 04-...

  • 非己勿贪

    2018-05-05 星期六 小雨 今天,我们去市场买菜,孩子想喝奶,我们就去买,有鲜奶、有酸...

  • 2018-05-05

    ZFQ_dacf 2018-05-05· 字数 543· 阅读 65· 日记本 姓名:周富强 公司:厦门大科机械有...

  • 2018-05-05

    2018-05-05 CindyWellin 祝新华 (稻盛哲学学习会)打卡第33天 姓名:祝新华 部门:业务部 ...

  • 5月5日觉查日记

    祉祤有梦 2018-05-05 21:52 · 字数 2330 · 阅读 27 · 日记本 晚上翻看了下51job...

  • 陕北行纪(7)——看演出《延安保育院》(原)

    陕北行纪(7)——看演出《延安保育院》(原) 2018-05-05 20:32:02| 分类: 旅游记忆 陕北之行...

  • 2018-05-06

    **2018-05-05 周六 雨️转晴** ️姐家妹妹“双满月”。 ️和婷微信,遇见自己。 ️进门两盏感应灯故障...

网友评论

      本文标题:2018-05-05

      本文链接:https://www.haomeiwen.com/subject/ivkerftx.html