-
空指针和野指针
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(){//....};
}
如果一个类中实现了纯虚函数,这个类变成了抽象类。
子类必须重写抽象类的纯虚函数。