• C++学习(1)


    一、C++概述(了解)

    C++在C语言的基础上添加了面向对象编程和泛型编程的支持

    二、helloword程序(掌握)

    1. #define _CET_SECURE_NO_WARNINGS//在开发软件visual studio编译 c文件时, visual studio认为strcpy,scanf等函数不安全的导致报警告和错误,导致无法编译通过。
    2. #include //引入头文件
    3. using namespace std;//标准命名空间
    4. int main()
    5. {
    6. //C++在C语言的基础上添加了面向对象和泛型编程的支持
    7. //cout是标准的输出流对象,打印字符串
    8. //endl是刷新缓冲器,并换行
    9. cout << "helloword"<
    10. system("pause");//意思就是让程序暂停一下,然后按任意键继续,初学的时候最多见于程序的末尾处,用于看运行结果,避免程序一闪而过。
    11. return 0;
    12. }

    三、面向对象的三大特性(了解)


        封装 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏(把函数和变量写在类里面,并给他们权限)
        继承 继承所表达的是类之间相关的关系,这种使得对象可以继承另外一类对象的特征和能力。减少代码和数据冗余
        多态 一个接口,多个方法


    四、命名空间


        1.为什么有命名空间:是因为解决多人合作是取标识符是重命名(名称冲突)的问题
        2.什么是命名空间:

    1. #define _CET_SECURE_NO_WARNINGS
    2. #include
    3. using namespace std;
    4. namespace A {//命名空间,A是空间的名字
    5. int a;
    6. void func() {}
    7. }
    8. namespace Maker {
    9. int a;
    10. namespace B{
    11. int b;
    12. }
    13. }
    14. namespace Maker {//这个Maker和上面的Maker是一个命名空间
    15. int c;
    16. }
    17. int main()
    18. {
    19. system("pause");
    20. return 0;
    21. }

    命名空间的注意


    1.命名空间只能写在全局
    2.命名空间可以嵌套命名空间
    3.命名空间是开放,随时可以加入新成员,但是新成员只能在加入后使用
    4.匿名的命名空间
    5.命名空间可以取别的名字
    6.分文件编写代码时,如果.h中有两个命名空间,但是里面的成员函数或者成员变量同名时,在.cpp中实现函数时,需要加上命名空间;

    头文件

    1. #pragma once
    2. //.h 和.cpp的区别
    3. // 函数的 .h声明 .cpp实现
    4. //一、用法不同
    5. //1、.h文件直接#include到需要的.cpp文件里,就相当于把.h文件的代码拷贝到.cpp文件
    6. //2、.cpp文件需要先自己生成.o文件,把不同.o文件连接生成可执行文件。
    7. //比如有3个cpp文件:a.cpp、b.cpp、c.cpp,其中一个包含main()函数,需要生成test程序,
    8. //步骤:
    9. //(1)生成3个.o文件:
    10. // cc - c a.cpp
    11. // cc - c b.cpp
    12. // cc - c c.cpp
    13. // 这样就得到3个.o文件:a.o、b.o、c.o
    14. // (2)链接生成test程序:cc - o test a.o b.o c.o
    15. // 就得到test可执行程序,输入. / test就可执行程序了。
    16. // 二、规范不同
    17. // 1、h文件一般包含类声明;
    18. // 2、cpp文件一般为同名h文件定义所声明的类函数。
    19. // 说明:一般可在cpp文件直接添加main()就可以测试该模块功能。
    20. #include
    21. using namespace std;
    22. namespace myMaker1 {
    23. //int ma;//定义变量会报错,在.cpp中引入.h相当于将.h中的文件复制过去,所以就存在ma多次定义了,出现变量MM重复的问题;
    24. void func();
    25. }
    26. namespace myMaker2 {
    27. void func();
    28. }
    29. class test
    30. {
    31. };

    源文件

    1. #define _CET_SECURE_NO_WARNINGS
    2. #include
    3. #include "03test.h"
    4. using namespace std;
    5. //using 声明可使得指定的标识符可用
    6. void test() {
    7. cout << "namespace Maker c" << Maker::c << endl;
    8. }
    9. namespace Maker {
    10. int c = 100;
    11. namespace B {
    12. int b = 200;
    13. }
    14. }void test01(){
    15. //新名字 旧名字
    16. namespace nameMaker = Maker;//在合作项目当中别人的命名空间和你的一样的时候,你可以给自己的命名空间取别名
    17. cout << nameMaker::B::b << endl;
    18. }
    19. void test1() {
    20. cout << "namespace Maker c" << Maker::c << endl;
    21. }
    22. //类似与static int d=50;只允许该文件使用的变量
    23. namespace {
    24. int d=50;
    25. }
    26. int mya = 10;//C语言中局部变量存在栈里,全局变量存静态存储区。
    27. //局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。
    28. //全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;
    29. int main()
    30. {
    31. int mya = 20;
    32. //就近原则
    33. cout << "mya=" << mya << endl;//20
    34. cout << "::mya" << ::mya << endl;//10
    35. cout << "namespace Maker c" << Maker::c << endl;//::作用域运算符 用来访问某个作用域里面的成员
    36. cout << Maker::B::b << endl;
    37. cout << d << endl;//50
    38. //test1();//会报错,因为声明命名空间在函数之后
    39. test1();
    40. //代码变为可执行程序的四步:预处理 编译 汇编 链接(报错中出现无法解释的外部命令说明链接出现了问题)
    41. myMaker1::func();//myMaker1为头文件中的命名空间
    42. system("pause");
    43. return 0;
    44. }
    45. //两个同名的变量,一个全局变量一个局部变量,那局部变量在前期作用域具有较高的优先权,它能屏蔽全局变量

    五、using声明和编译指令(重点)

    1. #define _CET_SECURE_NO_WARNINGS
    2. #include
    3. using namespace std;//要使用iostream就要将对应的命名空间引入
    4. namespace A
    5. {
    6. int a = 10;
    7. int b = 20;
    8. int c = 30;
    9. }
    10. void test01() {
    11. //using声明是让命名空间中某个标识符可以直接使用,就等于直接把int a = 10;给替换过来,就成为了局部变量
    12. using A::a;
    13. cout << a<
    14. //int a = 50;//注意:using声明了某个变量,在该作用域不能定义同名的变量
    15. }
    16. void test02()
    17. {
    18. //using编译指令,让某个命名空间的标识符都可以直接使用
    19. using namespace A;
    20. cout << a << endl;
    21. cout << b << endl;
    22. cout << c << endl;
    23. int a = 100;//为什么不会冲突;
    24. //类似于命名空间中的a是全局变量,此处的a是局部变量
    25. cout << a << endl;
    26. }
    27. int main()
    28. {
    29. test01();
    30. test02();
    31. system("pause");
    32. return 0;
    33. }

    六、struct类型加强(重点)

    加强一  c中定义结构体需要加上struct关键字,C++不需要

    加强二  c中结构体中只能定义成员变量,不能定义成员函数。C++既可以定义成员变量也可以定义成员函数

    1. #define _CET_SECURE_NO_WARNINGS
    2. #include
    3. using namespace std;
    4. //加强一
    5. //这是自定义的数据类型
    6. struct Maker//没有分配空间,因为这只是一个数据类型
    7. {
    8. char name[64];
    9. int age;
    10. };
    11. void test01() {
    12. //int 只是一个数据类型,只写int没有分配空间
    13. Maker a;//这时候才进行分配命名空间,不需要加struct就可以定义变量
    14. }
    15. //加强二
    16. struct Maker2
    17. {
    18. int a;
    19. void func() {//结构体内可以写函数
    20. cout << "func" << endl;
    21. }
    22. };
    23. void test02(){
    24. Maker2 a2;
    25. a2.func();
    26. }
    27. int main()
    28. {
    29. test01();
    30. test02();
    31. system("pause");
    32. return 0;
    33. }

    七、更严格的类型转换(了解)

    不能隐式转换,必须是显示的转换

    1. #define _CET_SECURE_NO_WARNINGS
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. //不能进行隐式转换,只能进行显示转换
    7. //char* p = malloc(64);//报错;c中是可以这样写的但是C++数据类型是比较严格的
    8. char* p = (char*)malloc(64);//malloc返回的是void * malloc分配的内存大小至少为参数所指定的字节数
    9. system("pause");
    10. return 0;
    11. }

    八、三目运算符(了解)

    C++案例

    1. #define _CET_SECURE_NO_WARNINGS
    2. #include
    3. using namespace std;
    4. void test()
    5. {
    6. int a = 10;
    7. int b = 20;
    8. (a > b ? a : b) = 100;
    9. //C语言的三目运算符返回的是右值
    10. //C++的三目运算符返回的是左值是空间
    11. cout << "a=" << a << endl;
    12. cout << "b=" << b << endl;
    13. }
    14. int main()
    15. {
    16. test();
    17. system("pause");
    18. return 0;
    19. }

    C案例

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. #include
    5. void test()
    6. {
    7. int a = 10;
    8. int b = 20;
    9. printf("%d\n", a > b ? a : b);
    10. //( a > b ? a : b)=100//错误
    11. //这个表达式返回的右值是数值,返回的是20
    12. //20=100
    13. *(a > b ? &a : &b) = 100;
    14. printf("b=%d\n", b);
    15. }
    16. int main()
    17. {
    18. test();
    19. return 0;
    20. }

    九、C/C++的const(重点)

    const变量为常量,不能直接修改,可以间接修改。

    C++案例

    C++语言的const修饰的变量有时候有空间,有时候没有空间(发生常量折叠,且没有对变量进行取地址操作)

    C++语言中const修饰的全局变量具有内部链接属性,只能在当前文件使用。要使用外部链接的话两侧都加extern即可

    1. #define _CET_SECURE_NO_WARNINGS
    2. #include
    3. using namespace std;
    4. const int a = 100;//没有内存
    5. void test()
    6. {
    7. //发生了常量折叠
    8. cout << "a:" << a << endl;//在编译阶段,编译器cout << "a:" << 100 << endl; 速度更快
    9. cout << "&a:" << &a << endl;
    10. //volatile禁止优化
    11. volatile const int bb = 20;//栈区
    12. int* p = (int*)&bb;//进行了取地址操作,所以有空间
    13. *p = 2000;
    14. cout << "bb:" << bb << endl;//优化的时候为20 编译器直接修改cout << "bb:" << 20 << endl; 编译器的问题 添加volatile后为2000
    15. cout << "*p" << *p << endl;//2000
    16. cout << "bb的地址" << (int)&bb << endl;
    17. cout << "p指向的地址" << (int)p << endl;
    18. }
    19. int main()
    20. {
    21. test();
    22. system("pause");
    23. return 0;
    24. }

    C++编译器不能优化数据的情况

    1.如果用变量给const修饰的局部变量赋值,那么编译不会优化

    2.不能优化自定义数据类型

    1. #define _CET_SECURE_NO_WARNINGS
    2. #include
    3. using namespace std;
    4. void test() {
    5. int a = 10;
    6. const int b = a;
    7. int *p = (int *)&b;
    8. *p = 100;
    9. cout << "b=" << b << endl;
    10. cout << "*p=" << *p << endl;
    11. }
    12. //自定义数据类型,编译器不能优化
    13. struct Maker{
    14. Maker(){//构造函数
    15. a = 100;
    16. }
    17. int a;
    18. };
    19. void test02(){
    20. const Maker ma;//实例化对象,并初始化a
    21. cout << ma.a<
    22. Maker *p = (Maker *)&ma.a;
    23. p->a=200;
    24. cout<//没有优化,因为不能优化自定义数据类型
    25. }
    26. int main()
    27. {
    28. //test();
    29. test02();
    30. system("pause");
    31. return 0;
    32. }

    C案例

    全局的const不能直接修改也不能间接修改

    局部的const不可以直接修改但是可以间接修改

    C语言的const修饰的全局变量具有外部链接(extern)属性

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. #include
    5. const int a = 10;//常量区,一旦初始化,不能修改
    6. int main()
    7. {
    8. //C语言的const修饰的变量都有空间
    9. 不能直接修改全局常量
    10. //a = 200;
    11. 也不能间接修改全局常量
    12. //int *p = (int*)&a;
    13. //*p = 100;
    14. //printf("%d\n",a);
    15. const int b = 20;//栈区
    16. //b = 200;//不能直接修改局部常量
    17. int *p = &b;//可以间接修改局部常量
    18. *p = 200;
    19. printf("%d\n", b);
    20. //使用别的文件的全局const修饰的变量需要声明
    21. extern const int c;//C语言的const修饰的全局变量具有外部链接属性
    22. printf("%d\n", c);
    23. system("pause");//让程序暂停一下
    24. return 0;
    25. }

  • 相关阅读:
    大数据杂谈
    Python3,这应该是,使用最广泛的6个内置函数,别说你还不知道。
    vue+nodejs+express+jwt如何生成并处理token
    队列(JAVA)
    量化:基于支持向量机的择时策略
    C语言单片机
    基于SSM的“大学生艺术节”管理系统的设计与实现
    VB6.0研发五金厂信息管理系统,研发适合小企业小工厂的信息系统
    制作一个简单HTML旅游网站(HTML+CSS+JS)无锡旅游网页设计与实现8个页面
    软考70-上午题-【面向对象技术2-UML】-UML中的图1
  • 原文地址:https://blog.csdn.net/qq_39397927/article/details/132997215