C++ 总体内容(1)

1 C++概述

  1.1 C++两大编程思想

    1.1.1 面向对象  泛型编程

  1.2 C++98标准

2 C++书写hello world

  2.1 包含头文件 #include <iostream> //标准输入输出头文件

  2.2 using namespace std; //使用标准命名空间

  2.3 cout << "hello world" << endl;

  2.4 面向对象三大特征: 封装、继承、多态

3 双冒号作用域运算符

  3.1 ::前面如果没有任何作用域,就代表全局作用域

4 命名空间 namespace

  4.1 命名空间的用途:解决命名冲突

  4.2 命名空间下,可以存放变量,函数,结构体,类...

  4.3 命名空间必须声明在全局的作用域下

  4.4 命名空间可以嵌套命名空间

  4.5 命名空间是开放的,可以随时向命名空间添加新的成员

  4.6 命名空间是可以匿名的

namespace
{
    int a = 10;
    int b = 20; 
}
// 以上相当于:static int a = 10; static int b = 20; 匿名命名空间中的变量a和变量b只能在本文件使用

  4.7 命名空间是可以取别名的

namespace veryLongName
{
    int a = 100;
}

void test()
{
    namespace veryShortName = veryLongName;
    cout << veryShortName::a << endl;
    cout << veryLongName::a << endl;
}

5 using 声明和using 编译指令

  5.1 using 声明

    5.1.1 声明的格式: using student::name;

    5.1.2 当就近原则和 using 声明同时出现时,需要避免二义性

  5.2 using 编译指令

    5.2.1 using namespace std;

    5.2.2 如果出现就近原则,优先使用就近原则

    5.2.3 如果有多个命名空间打开,并且存在同名的变量,使用的时候需要加作用域区分

6  C++对C语言的增强

  6.1 全局变量增强

  6.2 函数检测增强

    6.2.1 形参变量类型检测增强,函数声明的返回值检测增强,函数返回值检测增强,调用时参数传入个数检测增强

  6.3 类型转换检测增强

    6.4.1 malloc返回的void* 在C++下必须强转

  6.4 struct 增强

    C语言中,结构体里面不能放函数

    C语言中,声明结构体必须加上struct关键字

  6.5 bool 类型增强

    C语言中,没有bool 类型

  6.6 三目运算符增强

    C语言中,三目运算符返回的是值  *(a > b ? &a : &b) = 10; 

    C++语言中,三目运算符返回的是变量  a > b ? a : b = 10; 和上面的语句等效

  6.7 const 增强

    6.7.1 C语言下

      6.7.1.1 全局const 语法可以通过,运行报错

      6.7.1.2 局部const 语法通过,运行成功,并可以进行修改

void test()
{
    const int a = 10;  
    int arr[a] = {0};  // 错误,a是伪常量
}

    6.7.2 C++语言下

      6.7.2.1 全局const 语法可以通过,运行报错

      6.7.2.2 局部const 语法通过,可以运行,但是不能进行修改(const修饰的变量是放在符号表中的,不能进行修改)

void test()
{
    const int a = 10;

    int* p = (int*)&a;
    *p = 20;
    std::cout << a << std::endl; // 10

    // 编译器默认的操作
    // int temp = a;
    // int* p = &a; <<=>> int* p = &temp;
    // *p = 20; <<=>> temp = 20;

    int arr[a] = { 100 }; // a 是真正的常量
    std::cout << arr[0] << std::endl; // 100
}

6.8 const 在C语言下,默认是外部链接属性

  在a.c文件中 定义全局const变量, const int a = 100; 这里编译器默认会在前面加上 extern ,让该变量可以在其他文件中进行使用 

  在b.c文件中,使用方式如下:

void test()
{
    extern int a; // 告诉编译器去其他文件寻找变量a
    printf("a = %d\n", a);
}

6.9 const 在C++语言下,默认是内部链接属性

6.10   const分配内存的情况

  6.11 对const修饰的变量取地址的时候,会分配临时内存

  6.12 const前加入extern关键字后,会分配内存,此时可以修改该const值

  6.13 使用变量来初始化const修饰的变量,此时会分配内存,可以修改该const值

void test()
{
    int a = 10;
    const int b = a;
    int* p = (int*)&b;
    *p = 20;
    std::cout << b << std::endl; // 20
}

  6.14 对于自定义的数据类型,会分配内存,此时也可以修改该const值

  6.15 尽量利用const来代替define

    6.15.1 宏常量 没有类型

    6.15.2 宏常量 不重视作用域

7 引用

  7.1 用途,给内存(变量)起别名

  7.2 语法: type& 别名 = 原名

  7.3 引用必须初始化

  7.4 引用一旦初始化,就不可以修改其指向了

8 函数参数的传递方式

  值传递

  地址传递(也可以算是值传递,这个没必要去纠结)

  引用传递

9 引用的注意事项

  9.1 不要返回局部变量的引用

  9.2 如果函数的返回值是引用,那么这个函数调用可以作为左值进行运算

 10 引用的本质

  10.1 引用就是一个指针常量

  10.2 所以引用必须进行初始化

  10.3 初始化后不能修改其指向

void test(int& ref) // 编译器会转换为 int* const ref = &a
{
    ref = 100; // 编译器自动转化为 *ref = 100;
}

int main()
{
    int a = 10;
    int& ref_a = a; // 编译器会自动转化为 int* const ref_a = &a;
    ref_a = 20; // 编译器会自动转化为 *ref_a = 20;
    cout << a << endl; // 20
    cout << ref_a << endl; // 20
    test(a);
    cout << a << endl; // 100

    return 0;
}

11 指针的引用

  11.1 通过引用技术,可以简化指针

12 常量的引用

  12.1 使用场景:修饰函数中的形参,防止误操作

 

posted @ 2019-02-24 14:05  c&z  阅读(638)  评论(0编辑  收藏  举报