• c++学习笔记


    声明:我的c++笔记是建立在王桂林老师的视频和书籍的基础上的,我觉得这可能是中国最好的c++教学。我已经得到王老师的许可,推荐大家去看看,腾讯课堂网址https://ke.qq.com/course/115806这个笔记很大一部分是为了给自己看,当然希望大家不吝啬你们的想法思路,多多指教。
    c++顾名思义 ++意味着c++是建立在c的基础上的,c++原来叫做 c with class 带类的c。按照惯例 "Hello Word"走起

    c++

    1 #include <iostream>
    2 
    3 using namespace std;
    4 
    5 int main(int argc, char *argv[])
    6 {
    7     cout << "Hello World!" << endl;
    8     return 0;
    9 }

    作为对比c

    1 #include <stdio.h>
    2 
    3 int main(int argc, char *argv[])
    4 {
    5     printf("Hello World!
    ");
    6     return 0;
    7 }

    看起来基本结构很相似,我所接触的程序语言无论是python matlab c  几乎都是从数据类型开始的,c++也不例外。毕竟编程语言就是处理数据的工具,最终还是要回归到人上。类型增强

    真正的const

    c语言中 const  修饰变量的时候 变量会变成一个常量 但是这是绝对的吗?c语言最大的特点就是自由,指针是C语言的灵魂,不多说上程序,不过我们首先得回顾一下 const 是怎么修饰变量的

     1 #include <stdio.h>
     2 
     3 int main(int argc, char *argv[])
     4 {
     5 
     6    const int a=1;//const 修饰 a  等价于 int const a=1;
     7    const int *b=0;//const 修饰*b  等价于 int const *b=1;
     8     const int * const p=2;// const 修饰 *p  和p  指针和指针所指的变量都不能改变
     9    return 0;
    10 }

     方法:去掉类型看const修饰什么

    c语言中的const

    1 #include <stdio.h>
    2 int main(int argc, char *argv[])
    3 {
    4     const int a=1;
    5     int *p=&a;
    6     *p=1024;//明修栈道 暗度陈仓
    7     printf("%d
    ",a);
    8     return 0;
    9 }

    可以看出c语言的const并不严格 const int *类型赋值给了int * 可以通过指针间接访问变量

    c++中的const

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     const int a=100;//c++中const变量只能在定义时赋值
     8     int *p=&a;//无法从const int * 转换为int *
     9     cout <<a << endl;
    10     return 0;
    11 }

    编译结果:

    第一行是警告应该是中文编码问题,忽略它,主要看第二行,可以看出c++中const变量是真正的无法修改,类型检查比较严格,并且c++中const 变量只能在定义的时候赋值,c语言可以不复制,c++的严谨凸显无疑。

    再来体会一下两者的差别

     1 #include <stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 int main(int argc, char *argv[])
     5 {
     6     int arr[2][3];
     7     char *p="hello c++";
     8     char *q=malloc(strlen(p)+1);//void * 转换为 char*不过推荐大家加上强转
     9     strcpy(q,p);
    10     printf("%s
    ",q);
    11     free(q);
    12     int **a=arr;//const int * 数组名是const的指针变量 赋值给指向指针的指针
    13     return 0;
    14 }

    c++中

     1 #include <iostream>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 using namespace std;
     5 
     6 int main(int argc, char *argv[])
     7 {
     8     int arr[2][3];
     9     char p[]="hello c++";
    10     char *q=malloc(strlen(p)+1);//void * 转换为 char*不过推荐大家加上强转
    11     strcpy(q,p);
    12     cout<<q<<endl;
    13     free(q);
    14     int **a=arr;//const int * 数组名是const的指针变量 赋值给指向指针的指针
    15     return 0;
    16 }

    运行结果:

    c++相对于c比较严谨 新增逻辑类型bool(c99也有这种类型,不过我是以标准c来比较的)

    在c语言中0为假非零为真 c++新建了逻辑类型bool来表示  不多说上代码

     1 #include <stdio.h>
     2 
     3 int main(int argc, char *argv[])
     4 {
     5 
     6    if(1)
     7    {
     8        printf("ture");
     9 }
    10 else{
    11        printf("flase");
    12    }
    13    return 0;
    14 }

    c++

     1 #include <iostream>
     2 using namespace std;
     3 int main() {
     4  bool flag = true;
     5     if(flag)
     6         printf("flag is true
    ");
     7     else
     8         printf("flag is flase
    ");
     9 
    10     printf("sizeof(flag) = %d sizeof(bool) = %d
    ", sizeof(flag),sizeof(bool));
    11 
    12     flag = 2000;
    13     printf("flag = %d
    ",flag);
    14     return 0;
    15 }

    引用王老师的话“c 语言的逻辑真假用 0 和非 0 来表示。而 C++中有了具体的类型,但其本质,仍是 一个 char 类型的变量可被 0 和非 0 的数据赋值。”虽然能被赋值但是用printf输出后还是1比如bool类型被赋值但是printf后还是逻辑值1,觉得这个设定有点奇怪。

    bool类型的本质(枚举类型)

    #include <stdio.h>
    enum BOOL
    {FLASE,TRUE};
    int main(int argc, char *argv[])
    {
        enum BOOL flag=TRUE;//用枚举变量创建逻辑类型
        if(flag)
        printf("true
    ");
        else
        printf("flase
    ");
        flag=100;//C语言中枚举不严格
        return 0;
    }

    可以看出bool类型本质上就是一种枚举,不过C语言中的枚举并不严格,那么首先枚举是什么?

    百度百科:在数学计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。[1]  是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。

    王老师的枚举:c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而 C++中枚举变量, 只能用被枚举出来的元素初始化。枚举的常被用来取代宏常量。

    我所理解的枚举就是列出所有可能的数据集合,枚举变量必须在其中选择。由于枚举变量定义的时候集合里面的数据被赋值,所以副作用可以用来替代宏常量。

    c++的枚举

     1 #include <iostream>
     2 
     3 using namespace std;
     4 enum day
     5 {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY};
     6 int main(int argc, char *argv[])
     7 {
     8     day today=SUNDAY;
     9     today=100;
    10     cout << today<< endl;
    11     return 0;
    12 }

    运行结果:

    c++是真正意义上的枚举,枚举变量不能被赋值任意整型。
    总结:从整体上看c++比c严谨,c比c++自由。
    扯蛋时间:我喜欢c++的bool,枚举,但是我也喜欢c的const,自由就是自律,相对的。

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    CF1386C Joker
    P7486 「StOI2031」彩虹
    CF1516E Baby Ehab Plays with Permutations
    重拾莫比乌斯反演
    联合省选 2020 补题记录
    拉格朗日插值如何插出系数
    NOI Online 2021 补题
    Re:从0开始的多项式生活
    LOJ #6485. LJJ 学二项式定理
    P5591 小猪佩奇学数学
  • 原文地址:https://www.cnblogs.com/praysunday/p/7733050.html
Copyright © 2020-2023  润新知