C++简答

1、请说明C++的类成员函数和类静态函数的区别?
答:
a、静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存。
举例如下:
class base{
static int func1();
int func2();
};
int (pf1)()=&base::func1;//普通的函数指针
int (base::
pf2)()=&base::func2;//成员函数指针
b、静态成员函数不可以调用类的非静态成员
因为静态成员函数不含this指针。
c、静态成员函数不可以同时声明为virtual、const、volatile函数
举例如下:
class base{
virtual static void func1();//错误
static void func2() const;//错误
static void func3() volatile;//错误
};
2、请问C++的类和C里面的struct有什么区别?
(1)C++类中属性默认访问类型为private,而C++中的struct默认的访问类型为public
(2)C++类可以有继承,虚函数,多态,而C++中的struct不可以。
(3)C语言struct里面不可以有函数,只能有变量和函数指针,C++给C中的struct功能扩展了
3、请解释野指针,堆栈溢出的概念,并阐述在编码过程中所带来的问题及屏蔽方法。
A、野指针
野指针:“野指针”是指向“垃圾”内存(不可用内存)的指针。
野指针的成因主要有三种:
1、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
2、指针P被free或者delete之后,没有置为NULL。让人误认为P是个合法的指针。别看free和delete的名字(尤delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
free( p );
if ( p != NULL )
p = NULL;
3、指针操作超越了变量的作用范围。比如不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。示例程序如下:
class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
class B
{
public:
A *p;
void Test(void)
{
A a;
p = &a; // 注意 a 的生命期 ,只在这个函数Test中,而不是整个class B
}
void Test1()
{
p->Func(); // p 是“野指针”
}
};
函数 Test1 在执行语句 p->Func()时,p 的值还是 a 的地址,对象 a 的内容已经被清除,所以 p 就成了“野指针” 。
常见错误如下:
内存访问出错类别及出错关键点
数组访问越界:索引序号大于等于最大个数
指针访问越界:指针超出最大分配范围
字符串访问越界:
1、字符串结束符不存在
2、目标字符串缓冲区小于源字符串
迭代器访问越界:
1、迭代器越过右边界
2、用其它容器迭代位置赋值
访问野指针:变量声明时未初始化,链接器分配地址对应的随机值,例如:0xCDCDCDCD
访问空指针:指针所指地址为零(NULL)
B、堆栈溢出
堆栈溢出:堆栈溢出就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。
常见错误如下:
堆栈溢出一般代码能编译通过,运行过程中会出现堆栈溢出而崩溃。
实现类型、核心表现及建议
递归调用:结束条件不能满足而无法返回
循环调用:间接的函数循环调用
大对象参数:结构、对象以值传递方式使用。建议以指针、引用传递
大对象局部变量:函数中结构、类变量直接定义。建议使用 new 操作创建

你可能感兴趣的:(C++简答)