c++重要知识点

  •  空指针和野指针

 int *p = NULL; //空指针,即地址为0的指针,用于初始化指针,不可被访问

int *q = (int)0x1234; //野指针,因为没有申请访问地址0x1234权限,所以不可访问

空指针和野指针,我们都没有权限访问。


  •  指针地址大小

指针地址所占内存大小跟系统有关。

32位机的指针占4个byte,64位机占8个byte。


  • 指针常量和常量指针的声明

int a = 1;

int b = 2;

const int * p = &a; //常量指针

p = &b; //正确

*p = b; //错误

int * const q = &a; // 指针常量

q = &b;  //错误

*q = b; //正确

 

区别:

确实很不容易理解,但是要从源头理解,指针和普通的变量一样自己也是有一段属于自己的内测,他存放的只不过是其他变量的地址,所以通过地址访问其他变量。

常量指针意味着,const之后是把 int 指针*修饰了,指针指向的值就不可以修改了,指针存放的地址,也就是指针的指向可变。

指针常量意味着,const之后修饰的是指针本身,指针存放的值,也就是指针的指向不可以修改,但是指针指向的值可变。

 


  • 利用指针访问数组 

int arr[] = {1,2,3};

int *p = arr; //数组名为首地址

//利用指针访问数组

for(int i=0;i<sizeof(arr)/sizeof(int);i++){
  cout << *p << endl;
  p++;
}

//普通方式访问

for(int i=0;i<sizeof(arr)/sizeof(int);i++){
  cout << arr[i] << endl;
}


  • 不要返回局部变量的地址 

局部变量存在栈区,引用完毕后会被销毁,所以不要返回局部变量的地址。


  •  指向堆区的指针

int * p = new int(10);

指针在栈区,而指针保存的值在堆区


  • 释放数组 

int * arr = new int[10];

delete[] arr; //释放数组


 

  • 引用

引用就是变量的别名

int a = 0;

int &b = a; //引用初始化,这是引用必须的步骤,而且b引用a后不能再引用其他变量

至此,&符号有两个功能:指针取地址、取别名


  •  形参修饰实参的方法:地址传递引用传递

指针传递:int func(int *ptr){}

引用传递:int func(int &foo){}


 

  • 引用的本质

int & func() {

  //.....

  return 1;

}

func() = 1000;  // func()是引用的,能被赋值了

引用的本质: 指针常量


  •  struct和class的区别

struct和class的区别就在于默认访问权限不同。

struct: public

class: private

 

浅拷贝、深拷贝


  •  class的嵌套场景下,构造和析构的顺序

class A{

 B b;

}

class B{

}

A a;

先构造B,再构造A

先析构A,再析构B


  •  静态成员

类和对象都能访问静态成员函数

类的静态成员函数只能访问静态成员变量,因为他没法区分非静态成员变量是哪个对象的。

空对象的内存大小是1byte


 

this的本质是指针常量


  •  友元

友元实现的三种方案:

1.全局函数

2.类

3.类中的成员函数


非静态成员不会被继承

子类继承父类的所有成员变量和函数,编译器会屏蔽子类对父类的private成员访问


  •  多态

多态有两类:

静态多态:重载实现,在编译阶段确定函数地址

动态多态: 派生和虚函数实现,在运行阶段确定函数地址


  • 虚函数 

class A{

public:

  virtual int func() = 0; // =0代表纯虚函数

}

class B:public A

{

public: 

  int func(){//....};

}

 

如果一个类中实现了纯虚函数,这个类变成了抽象类

子类必须重写抽象类的纯虚函数。

----------------------------------------------------------------------------------------------------------------------------------

堆区开辟的数组如何释放?

int *arr[] = new int [5];

delete[] arr;

 

posted @ 2020-11-13 00:15  琵琶真的行  阅读(118)  评论(0编辑  收藏  举报