1. static关键字作用
隐藏:不加statci的全局变量和函数具有全局可见性,可被其他源文件访问。添加static可以使得全局变量和函数对其他源文件隐藏,不可访问。
内容持久性:全局变量和添加static的局部变量存在静态数据区,只在程序开始运行时进行唯一一次初始化。
修饰成员变量:用static修饰类的属性和方法,使其成为类的属性和方法,即属于所有对象/实例共享的成员。
C中static用于修饰变量、函数。而C++还用于修饰类的成员变量和函数。
2. 引用和指针的区别
1.引用必须要初始化,如:int a; int &r=a;引用r为变量a的别名,和a指向同一块地址。(不能未初始化,直接int &rr)
2.指针存放的是数据的地址,
int a=1;
int &p;
p=&a,取址,存放a的地址;
*p=4,将p指向的地址中,值改为4,即a=4;
*(取值运算符,&取址运算符)
3.综合1,2点也可知:引用不能指向空,指针可以。
3.头文件用<>和" "的区别
索引路径的区别,<>从标准库中查找;" "从当前工作路径中查找。
4.全局变量和局部变量存储位置有什么区别?
全局变量存在静态数据区,局部变量存在栈区。
若局部变量添加了static,则也会存在静态数据区。
全局变量 | 静态全局变量 | 局部变量 | 静态局部变量 | |
---|---|---|---|---|
存储位置 | 静态数据区 | 静态数据区 | 栈区 | 静态数据区 |
可见范围 | 所有源文件可见 | 仅当前源文件可见 | 仅当前函数可见 | 仅当前函数可见 |
5.指针和数组的区别
指针:存放地址,通过地址间接访问数据。随意指向任意内存块。
数组:存放数据,直接访问。要么存放在静态区(全局),要么在栈区。
6.内存分配
栈区:存放函数的参数,局部变量等。程序结束会自动释放
堆区:存放动态数据,程序员手动释放
静态区:全局变量、static修饰的静态变量。自动释放
常量区:常量字符串。自动释放
7.数组指针和指针数组
数组指针:也称为行指针。指针地址+1,相当于移动一个数组的长度。
如:
i
n
t
a
[
3
]
;
i
n
t
∗
p
=
a
;
p
+
+
;
int \space a[3]; int \space *p=a; p++;
int a[3];int ∗p=a;p++;则此时p指向的是数组a末尾的下一个位置的地址,即a[3]位置.
i
n
t
a
[
3
]
[
4
]
;
i
n
t
(
∗
p
)
[
4
]
;
p
=
a
;
int \space a[3][4]; int \space (*p)[4];\space p=a;
int a[3][4];int (∗p)[4]; p=a;此时p指向第一行
a
[
0
]
[
]
a[0][]
a[0][],若p++,则p此时指向
a
[
1
]
[
]
a[1][]
a[1][]
指针数组:指向数组中的每个元素。地址+1,相当于指向下一个元素。
如:
i
n
t
a
[
3
]
;
i
n
t
∗
p
[
3
]
;
p
=
a
;
int \space a[3]; int \space *p[3];p=a;
int a[3];int ∗p[3];p=a;
此时p指向数组a的第一个元素a[0];
p++,则指向数组a的第二个元素a[1];
定义区别:
数组指针:
(
∗
p
)
[
]
(*p)[]
(∗p)[]
指针数组:*
p
[
]
p[]
p[]
8. 关键字const的作用
定义一个只读的变量或对象。
修饰普通变量:变量不可变。如:const int a;常整型a不可变
修饰指针变量:
(1)常量指针:修饰指针指向的内容,如:const int *p=1;(或int const *p=&a;) 指针指向的内容不可变,但是指针是可以变的
(2)指针常量:修饰指针,如:int * const p=&a(a为变量);指针不可变,但是指针的内容是可以变的
(3)修饰指针和指针指向的内容,如:const int * const p=&a;指针和指针指向的内容均不可变
9. C中malloc和C++中new的区别
(malloc和free在C++中都可以使用)
malloc仅用于分配内存;new还可以用于创建类的对象/实例,调用构造函数。
free 仅用于回收内存;delete还可以用于销毁类的的对象,调用析构函数。
malloc和free是函数,返回空指针;new和delete是操作符,返回某种数据类型指针。
10. 数组a和&a的区别
int a[3]={1,2,3};
int *p=(int *)(&a+1);
cout<<*(a+1)<<endl:
cout<<*(p-1)<<endl;
则*(a+1)=2,a表示数组的首地址;
*(p-1)=3,&a是数组指针,+1表示移动整个数组长度。
11.面向对象的三大特征
封装:将客观事物抽象成类
多态:将父类设置成与一个或多个子对象相等。子类给父类赋值后,父类可以根据赋值进行特定的运行。
继承:父类可以被子类继承
12.构造函数和析构函数
class C{
C(){} //构造函数
~C(){}//析构函数
};
构造:C() {};创建类的对象时自动调用;没有函数返回类型;可以带参数;可以有多个(通过函数重载进行区分,即参数个数、类型的不同进去区分);
析构:~C(){};删除创建对象时自动调用;没有函数返回类型;不能带参数;只能有一个;
13.类的成员函数重写、重载、隐藏的区别
重写:重写函数和别重写函数在两个类中;参数列表必须相同;重写的基类中,被重写函数必须用virtual修饰
重载:在同一个类中;参数列表必须不同;可以被virtual修饰也可以不修饰;
隐藏:在不同类中;参数列表可以相同也可以不同
14.如何避免野指针
1.指针声明时未初始化:指针变量声明时进行初始化,或者指向NULL
2.指针被delete后没有置为NULL:指针指向的内存被释放后,指针应指向NULL
3.指针操作超越了变量作用范围:变量作用域结束前释放内存,并让指针指向NULL