C++语言基础
1. 函数
1.1 C++新增:多态
-
函数重载( overload )
-
函数重写(覆写,overrride)
编译器会根据实参的类型来⾃动确定调⽤哪个重载函数
1.2 C++新增:内联函数
修饰关键字:inline
作用:编译时直接将函数替换为一堆代码,减少函数调用带来的开销。
比#define安全
成员函数默认内联,即使不写inline;外部函数必须加inline才能内联。
1.3 内存分配管理
每一个函数在栈空间上都有一段栈帧,保存这当前函数所需的变量等。当函数出栈时,这些成员也随之销毁。
2. const修饰符
const修饰的对象、变量,在运行过程中不能修改其值。
const int a = 1;
a = 2; // 错误!
// 会报错:error: assignment of read-only variable 'a'
注意:常量必须在声明时被初始化 const int a; // 错误!
关于const可修改的练习:
例1
int main() {const int a = 1;int* add = &a; // 这一句有语法问题:invalid conversion from 'const int*' to 'int*'*add = 2;return 0;
}
编译器在做隐式转换的时候不会添加或删除const修饰,如果类型不匹配会报语法错误。
正确做法:使用强制类型转换,消除语法问题
int main() {const int a = 1;int* add = (int*)&a; // 正确*add = 2;return 0;
}
编译器不会自作主张修改const修饰,因为可能有潜在风险,但是如果人为地强制转化,说明是程序员告诉编译器:“就这么干,我说的!“。编译器就会很放心地让程序员来承担责任,不会报错 /doge
注意:这里a为局部变量,即使被const修饰,也保存在栈上(假设没有常量折叠)。如果换做全局变量,被const修饰后存储在常量区中,为只读属性,没有办法修改的。
例2:指针变量也是变量,所以可用const修饰
常量指针
int main() {char array[] = {'a', 'b', 'c', 'd', '\0'};char* const name = array; // 注意这里的 * 和 const的前后位置name[0] = 'H'; // 正确name = (char*)"Hi"; // 错误! assignment of read-only variable 'name'return 0;
}
指向常量的指针
int main() {char array[] = {'a', 'b', 'c', 'd', '\0'};char const* name = array; // 注意这里的 * 和 const的前后位置name[0] = 'H'; // 错误!name = (char*)"Hi"; // 正确return 0;
}
这里可以这样子去记忆:const负责在他左边的东西,如果左边是char*,说明地址是常量,如果左边是char,说明字符是常量。
3. 动态内存分配
常规的静态分配内存:int a[10] = {0};
数组a在编译的时候就被分配了固定大小的内存。
int n = 10;
int b[x]; // 对于多数编译器是不允许的,即使允许也会有⻛险,如多线程编程
而使用动态定义变量更灵活
int n = 10;
int* b = new int[n]();
注意:最后记得delete
4. 作用域运算符::
-
使用类的静态成员
-
解除被隐藏全局函数或变量
int num = 1; // 全局变量 main() {int num = 2; // 局部变量cout << num << endl; // 显示局部变量cout << ::num << endl; // 显示全局变量 }