C++ 高级语法学习与总结(代码实例)

    C++11增加了许多的特性,auto就是一个很明显的例子。  还有就是typedid()获取数据变量的类型

    看下面简短的代码:

         atuo: 很像java中的加强for循环....。

 1 //获取一个数据变量的类型
 2 #include<iostream>
 3 #include<stdlib.h>
 4 
 5 int main() {
 6 
 7     double db = 10.9;
 8     double *ps = &db;
 9     auto var =*ps;
10     std::cout<<typeid(var).name()<< std::endl;
11     getchar();
12   return 0;
13 }

关于C++关于款字符的使用:

 1 //关于宽字符的使用
 2 #include<iostream>
 3 
 4 #include<stdlib.h>
 5 #include<locale>
 6 
 7 int main(int argv ,char args []) {
 8 
 9     setlocale(LC_ALL, "chs");  //这就是设定为本地,中文简体
10     wchar_t * p2 = L"1234frd";
11     std::wcout << p2 << std::endl;
12     wchar_t *pi  = L"北京adas,你好!";
13     std::wcout << pi <<std::endl;
14 
15     getchar();
16     return 0;
17 }

 关于数组类型的使用:

 1 //新数组的使用
 2 #include<iostream>
 3 #include<array>
 4 #include<stdlib.h>
 5 
 6 
 7 int main(int argv ,char args []) {
 8 
 9    //array数据类型
10     
11     std::array<double ,5>data={2,3,4,5,6};
12     for (auto var : data) {
13         std::cout << "var =" << var << std::endl;
14     }
15     getchar();
16     return 0;
17 }

   对于这里,我们需要知道的是,array的建立实在栈的基础上,所以最大尺寸不要大于1M ,不然会出现栈溢出。

   而对于vector而言,是建立在堆上的,所以没有溢出的说法。

 4, C++新特性,lambda表达式(匿名函数)

 1 //新数组的使用
 2 #include<iostream>
 3 #include<vector>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 
 7 int main(int argv ,char args []) {
 8 
 9     std::vector<int>  myvec;
10     myvec.push_back(1);
11     myvec.push_back(2);
12     myvec.push_back(3);
13     myvec.push_back(4);
14     myvec.push_back(5);
15     int res = 0;
16     //lambda 表达式  求和
17     //&res直接操作一个变量,res等价于返回值,x代表参数
18     //每次充当迭代器指向的元素,大括号就是代码
19     std::for_each(myvec.begin(), myvec.end(), [&res](int x) {res += x; });
20     std::cout << res << std::endl;
21     std::cin.get();
22   return 0;
23 }

 上面的实例,做的就是一个一个从1~5的累加过程。采用迭代器实现lambda函数。

 5. 函数包装器管理内嵌函数:

   对于这一个C++高级语法的作用:

    第一:  可以用作设计执行接口,接口设计关卡,也可以用来计数。

    第二: 可以内嵌到另一个函数,实现函数的内嵌。游戏开发中,经常使用到这种方法。

/* 函数包装器管理内嵌函数 */
/*
  以一个简单的四则运算为例子
*/
//#pragma warning(disable: 2064)
#include<stdio.h>
#include<iostream>
#include<functional>

template <typename T ,typename F>
   T run(T a , T b , F f) {
    
       return f(a , b);
 }

int main(int argc , char * args []){

    using std::function;
    double db = 12.9; //double *
    //加 减 乘 除
    function<double(double,double)> Add = [](double a , double b) {
        return a+b;
    };
    function<double(double, double)> Sub = [](double a, double b) {
        return a - b;
    };
    function<double(double, double)> Mul = [](double a, double b) {
        return a*b;
    };
    function<double(double, double)>Div = [](double a, double b) {
        return a / b;
    };
    //定义一个函数数组
    function<double(double, double)>p[]= { Add,Sub,Mul,Div };
    char str[] = "+-*/";
    int i = 0;
    for(auto fun : p )
    std::cout <<"12 "<<str[i++]<<" 13 ="<< run<double>(12,13,fun) <<std::endl;
    std::cin.get();
  return 0;
}

运行结果如图:

当然对于函数包装器而言,还是可以调用外部函数的。不然怎么彰显它的高级二字。

 代码: 

 1 /* 函数包装器管理内嵌函数 */
 2 /*
 3   以一个简单的四则运算为例子
 4 */
 5 //#pragma warning(disable: 2064)
 6 #include<stdio.h>
 7 #include<iostream>
 8 #include<array>
 9 #include<functional>
10 
11 template <typename T ,typename F>
12    T run(T a , T b , F f) {
13     
14        return f(a , b);
15  }
16   double show(double  a, double  b) {
17 
18       std::cout << "这是一个外部函数,被调用" << std::endl;
19       return (a+b);
20   }
21 int main(int argc , char * args []){
22 
23     using std::function;
24     double db = 12.9; //double *
25     //加 减 乘 除
26     function<double(double,double)> Add = [](double a , double b) {
27         return a+b;
28     };
29     function<double(double, double)> Sub = [](double a, double b) {
30         return a - b;
31     };
32     function<double(double, double)> Mul = [](double a, double b) {
33         return a*b;
34     };
35     function<double(double, double)>Div = [](double a, double b) {
36         return a / b;
37     };
38     //定义一个函数数组
39     function<double(double, double)>p[]= { Add,Sub,Mul,Div ,show};
40     char str[] = "+-*/+";
41     int i = 0;
42     for(auto fun : p )
43     std::cout <<"12 "<<str[i++]<<" 13 ="<< run<double>(12,13,fun) <<std::endl;
44     std::cin.get();
45   return 0;
46 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏拭心的安卓进阶之路

Java 集合深入理解(11):LinkedList

今天心情鱼肚白,来学学 LinkedList 吧! 日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就是 LinkedList 了。 我们...

29370
来自专栏desperate633

LeetCode 20. Valid Parentheses题目分析代码

给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列。

9020
来自专栏小灰灰

JDK容器学习之LinkedList:底层存储&读写逻辑

LinkedList的底层结构及读写逻辑 链表容器,通常适用于频繁的新增删除,遍历的方式访问数据元素的场景 LinkedList 底层数据结构为链表,非线程安...

20380
来自专栏JavaEdge

"聊胜于无",浅析Java中的原子操作Java的指针Unsafe类i++不是线程安全的1 原子更新基本类型类2 原子更新数组3 AtomicReference(原子更新引用)4 原子更新字段Atomi

67060
来自专栏我的技术专栏

数据结构图文解析之:栈的简介及C++模板实现

16950
来自专栏haifeiWu与他朋友们的专栏

死磕Java之聊聊LinkedList源码(基于JDK1.8)

我们主要看研究一下下面的几个方法,LinkedList其他方法都是通过调用这几个方法来实现功能,包括LinkedList的双端队列的方法也是。

14040
来自专栏吾爱乐享

java之学习用LinkedList模拟栈数据结构的集合并测试

12340
来自专栏cmazxiaoma的架构师之路

浅谈CGLIB动态代理和JDK动态代理 学习笔记

57840
来自专栏文武兼修ing——机器学习与IC设计

栈与栈的实现栈栈的基本操作栈的实现

栈 栈是一种基础的数据结构,只从一端读写数据。基本特点就”后进先出“,例如顺序入栈1,2,3,4,5,再顺序出栈是5,4,3,2,1 栈的基本操作 栈的基本操作...

34250
来自专栏算法修养

UESTC 485 Game(康托,BFS)

Today I want to introduce an interesting game to you. Like eight puzzle, it is a...

28370

扫码关注云+社区

领取腾讯云代金券