C++总结

1.public继承和private继承有什么架构上的区别?

publicis-a的关系,继承接口与实现privatehas-a的关系 ,只继承实现

2.const

const修饰指针的情况,见下式:

int b = 500; 
const int* a = & [1] 
int const *a = & [2] 
int* const a = & [3] 
const int* const a = & [4] 

Effective c++Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

因此,[1][2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 [3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。

3.野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。

    “野指针不是NULL指针,是指向垃圾内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是野指针是很危险的,if语句对它不起作用。野指针的成因主要有两种:

一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

二、指针pfree或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看freedelete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:

char *p = (char *) malloc(100);

strcpy(p, “hello”);

free(p);        // p 所指的内存被释放,但是p所指的地址仍然不变

if(p != NULL)   // 没有起到防错作用

   strcpy(p, “world”);  // 出错

另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

4.请说出staticconst关键字尽可能多的作用

解答:

static关键字至少有下列n个作用:

(1) 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

(2) 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3) 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

(4) 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

(5) 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

const关键字至少有下列n个作用:

(1) 欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了

(2) 对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const

(3) 在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

(4) 对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;

(5) 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:

const classA operator*(const classA& a1,const classA& a2); 

operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:

classA a, b, c;

(a * b) = c; // a*b的结果赋值 

操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。

6.引用与指针有什么区别?

1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

3) 不存在指向空值的引用,但是存在指向空值的指针。

7.C++中为什么用模板类

答:(1)可用来创建动态增长和减小的数据结构

2)它是类型无关的,因此具有很高的可复用性。

3)它在编译时而不是运行时检查数据类型,保证了类型安全

4)它是平台无关的,可移植性

5)可用于基本数据类型

8.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?

答:栈存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理

程序运行时动态申请,new 和 malloc申请的内存就在堆上

 

 

 

你可能感兴趣的:(C++总结)