c++一些重要的细节

  •  空指针和野指针

 int *p = NULL; //空指针,即地址为0的指针

int *q = (int)0x1234; //野指针

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


  •  指针地址大小

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

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


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

const int * p; //常量指针

int * const p; // 指针常量


  • 利用指针访问数组 

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

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

//利用指针访问数组

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


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

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


  •  指向堆区的指针

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(){//....};

}

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

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

原文地址:https://www.cnblogs.com/zhengze/p/13967168.html