面向对象基础知识(1)

来源:互联网 发布:十三陵灵异事件知乎 编辑:程序博客网 时间:2024/04/28 01:55

1.用函数名调用函数和用函数指针调用函数有什么区别?

相同点:函数名和函数指针都代表函数的起始地址

不同点:

(1)通过函数名调用函数,如果被处理成内联,则函数的调用不会有栈帧的开辟和回退。

(2)通过函数指针调用,编译阶段绝不会被处理成内联,内联必须指定函数名。用函数指针的调用一定会有标准的栈帧的开辟和回退。

          当某些事件发生时,才知道具体调用的函数。

2.在C++中,一个空的类型占多少字节?(1个字节,声明该类型实例时,必须在内存中占据一定空间,由编译器决定)

   C语言 要求一个结构或联合至少有一个成员,否则编译不能通过。             

3.面向对象语言的四大特征?

 (1)抽象

(2)封装 (和隐藏):访问限定符

(3)继承

(4)多态

4.成员方法的返回值不要为指针型(不安全)

不要返回私有成员变量的指针,会把地址泄露出去。

5.成员方法在类外定义要在返回值后、函数名前加类作用域

6.在类内定义的成员方法:自动被编译器处理成inline函数

  在类外定义的除非显示加inline,否则还是普通的函数,有标准的栈针的开辟和回退。

7.(1)函数的实现一般不写在.h内,当多个cpp引用时,在多个cpp展开,容易引起函数重定义错误。

    (2)如果把成员函数的实现写在.h文件,

              如果写在类外,则在多个cpp文件中引用时会出现函数重定义错误

              如果写在类内,因为是内联函数,只有本文件可见,所以多个cppc引用时不会出现错误。

8.this指针  =è指向调用该成员方法的对象

9.编译器做的三件事:

(1)在汇编函数调用的地方,把调用该函数的对象的地址作为实参传进去。

(2)在成员方法所有的原型中每个第一个参数加指向该类类型的this指针

(3)在成员方法所有实现的地方,只要涉及成员变量,前面都加this->

10.构造函数和析构函数没有返回值,名字与类名一致。

CGoods():构造函数可以带参数,所以构造函数可以重载。

~CGoods():析构函数不能带参数,所以析构函数有且只有一个。

11.用类生成一个对象:

(1)根据对象的类类型sizeof(CGoods)分配内存,则对象的空间存在;

(2)调用相应的构造函数,调用完后,对象存在了.

12.你没有提供任何的构造函数和析构函数,编译器系统会为你产生默认的构造函数CGoods(){}和默认析构函数~CGoods(){}

   如果你提供了任意一个构造函数,那么系统就不会再产生默认的构造函数了。

编译器系统产生的函数有两个特点,public和inline  

13.构造函数不能自己调用,系统自动调用。因为构造函数调用前对象还未产生。析构函数可以自己调用,系统仍然会调用。

14.构造函数不是给对象分配内存的,构造函数只是对对象内存进行初始化的。

     析构函数不是释放对象的内存的,析构函数是在对象内存释放之前去释放对象占用的额外的其他系统资源。

     析构后对象不存在:在对象的内存上,对象的成员变量不拥有合法的初始值。

15.析构函数是在return处调用,右花括号之后内存回退。

16. 注意四个过程 内存的产生、对象的构造、对象的析构、内存的释放

17.初始化:左值正在定义。调用函数传参时,实参到形参是初始化。

      赋值:左值已经存在。

18.拷贝构造函数:用同类型已经存在的对象构造同类型的新对象

     拷贝构造函数不能按对象的值进行传递,会引起递归构造。



原创粉丝点击