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 使用场景:修饰函数中的形参,防止误操作