一、c和c++关键字总结

c和c++基础

一、static

1、面向过程时

1)数据持久化(包括全局变量和局部变量)
2)初始化为0
3)作用域的限制,(extern相反 在需要其他文件的地方声明一下即可)
限定变量在一个编译单元内,一个编译单元就是指一个cpp和它包含的头文件
4)修饰普通函数时,维持一份内存,受到作用域限制。

2、面向对象时

1)静态成员变量

  • 无this指针,所有对象共享
  • 必须类外初始化

2)静态成员函数

  • 所有对象共享
  • 静态成员函数不能访问非静态成员函数和非静态数据成员

二、const

1、修饰变量
  • 修饰局部变量
#include

int main() {
    const int a = 1;
    int *p = (int*)&a;
    *p = 2;
    printf("%d", a);// 输出2
}
  • 修饰全局变量
#include
const int a = 1;
int main() {
    int *p = (int*)&a;
    *p = 2;
    printf("%d", a);// 报错
}

C语言的const,对于局部变量而言,是将一个变量修饰为只读变量,既然是一个变量,那么其依然可以变,只不过我们不能通过已经被const修饰的变量名来修改。对于全局变量而言,其修饰的变量保存在代码段的rodata,这段内存是只读的,所以const修饰的全变量是真正意义上的常量。

2、修饰指针

常量指针

int * const p;
//p不可变 即p指向的内存地址不变 对内存内的值不做限制 即对p不可修改 *p可以

指向常量的指针

const int * p;
//p指向的值不可变 即p指向的内存地址内的值不可变 但p指向的地址无限制 即对*p不可修改 p可以
3、const修饰函数参数
4、const修饰成员变量

必须在初始化列表中进行初始化

5、const修饰成员函数
class a{
   void fun() const {}
};
  • 该函数不能修改成员变量的值
  • 该函数不能调用没有const修饰的成员函数(为了第一条),但可访问非const变量,交由编译器检查。
6、const修饰函数返回值
  • 当返回值为指针或引用时,保护指针指向的内容或引用的内容不被修改。

三、extern

1、修饰变量和函数

extern用在变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

2、extern "c"的用法

C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
https://blog.csdn.net/u013616945/article/details/75330936

四、new和malloc的区别

#include
int main(){
  int *p = (int*)malloc(sizeof(int) * 100);
} 
int main(){
  int *p = new int[100]();
} 

区别

  • 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸。
  • new操作符内存分配成功时,返回的是对象类型的指针。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
  • new会调用构造函数
  • new是一个操作符 new[]就是一个重载 而malloc为一个库函数
  • new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。
  • new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free则不会;
  • new分配的内存在自由存储区中,malloc分配的内存在堆中。

五、多态

你可能感兴趣的:(一、c和c++关键字总结)