从以下几个方面去讨论static的作用
修饰的对象: 变量, 函数
使用场景:
作用是避免了命名重复, 对其他源文件隐藏该变量和隔离错误的作用,有利于模块化程序
const关键字的作用:
修饰变量
两种:全局const和局部const,
**注意:**在C语言中,局部const是可以通过指针进行修改的,而在C++中,会把const修饰的所有常量会加载到符号表当中,每次获取const常量都会在符号表中查询,因此C++中的局部const成员无法修改,而全局const不管C/C++都不能通过指针修改
作用
#define var_d 100
const int var_c = 100;
//区别
//比如,在使用过程中,需要一个赋值
int a, b;
a = var_d;
b = var_d;
//本质上这里进行了两次分配,因为仅仅是将var_d替换成100
//如果是使用const修饰的常量赋值
a = var_c;
b = var_c;
//本质上这里只赋值了一次,因为var_c是一个常量
修饰函数参数 :表示函数参数不能修改
修饰函数返回值
类中常成员函数 :不修改成员变量
只读对象只能调用常成员函数,不可以调用普通成员函数
常成员函数之鞥呢调用常成员变量以及常成员函数
类常成员函数作用 :
区别:
是否需要初始化?
是否允许为空?
是否直接操作对象?
是否为对象
作用:
引用的作用
指针的作用
什么是野指针?
如何避免?
定义:
malloc, free是c当中的函数,而new,delete是c++当中的操作符
使用方式:
new/delete | malloc/free |
---|---|
自动计算所需分配内存 | 需要手动计算所需分配内存 |
new返回是对象类型的指针 | malloc返回void*, 需要转换为所需的类型 |
delete释放内存是需要对象类型的指针 | free是void*类型的指针 |
new分配失败会抛出异常 | malloc分配失败会返回null |
new是在free store上分配内存 | malloc是从堆上分配内存 |
new先调用operator new, 申请足够内存, 然后调用该类型的构造函数,初始化成员变量,最后返回对象类型的指针, delete先调用析构函数,在调用operator delete函数,释放内存
注意:delete,free调用后,内存不会立即释放,指针也不会只想空,为了避免野指针,释放内存后,应该把指针指向null
原理: 引用还没有声明的变量或者函数,这个变量或函数在其他地方声明;(不可以是静态)
使用场景:
都是C或者都是C++
C++调用C编译的变量或者函数
代码展示
文件内:
#include
int main()
{
extern int var_main;
extern void func_main(); //通常都是在main函数外声明一个函数,也可以使用extern
func_main();
printf("main var_main = %d\n", var_main);
return 0;
}
int var_main = 100;
void func_main()
{
printf("func_main var_main = %d\n", var_main);
}
文件外:
extern_other.c
#include
int var_other = 99;
void func_other()
{
printf("func_other var_main = %d\n", var_other);
}
extern_c.c
#include
int main()
{
extern int var_other;
extern void func_other();
func_other();
printf("main var_other = %d\n", var_other);
return 0;
}
编译时注意
#编译中要带上extern_other.c
gcc extern_c.c extern_other.c -o extern.exe
./extern.exe
C++调用C的情况:
由于C和C++的在编译时的命名不同(C++支持重载,因此跟C的命名有区别),用法如下
加"C"
extern_cpp.cpp
#include
extern "C" int var_other; //加"C", 需要声明在main函数外
extern "C" void func_other();
int main(void)
{
func_other();
var_other = 100;
printf("main var_other = %d\n", var_other);
return 0;
}
extern_other.c
#include
int var_other = 99;
void func_other()
{
printf("func_other var_main = %d\n", var_other);
}