[C++]01 面向对象中的问题

一.构造函数/析构函数是什么,具体意义是什么?

  1.构造函数就是在内存开辟后对内存进行初始化的操作,当构造函数调用完了,我们就说一个对象产生了。构造函数不是给对象开辟内存的。析构函数就是在对象内存释放之前将对象占用的其他资源释放掉。析构对象不是用来释放内存的

  2.构造函数和析构函数的名字必须和类名相同,析构函数名字前加~。

  3.构造函数和析构函数没有返回值。

  4.构造函数可以任意带参,所以说构造函数是可以重载的,析构函数不能带参,所以析构函数只有一个。

  5.当类中没有构造/析构函数的时候,编译器会给出不做任何操作的默认构造/析构函数。如果在类中定义了任意的构造函数,就不会产生默认构造函数了。

二.this指针是什么?

  我们都知道,一个类可以产生多个对象,每个对象都有自己的成员变量,这些对象共享这个类的成员方法。那么问题就来了,多个对象共享成员方法,那么当对象调用成员方法的时候,这些成员方法是如何知道是哪个对象进行的调用呢? this指针就是这个问题的回答

  类的成员方法一经编译,形参都会加上一个当前类类型的this指针变量,对象调用成员方法时,就将对象的地址作为方法的实参进行传递,这样就精准的将对象和成员方法联系在了一起。需要注意的是,在方法中访问其他成员,都是通过this指针来调用的。

三.关于对象浅拷贝和深拷贝的问题  

  浅拷贝:简单来说,浅拷贝可以理解为直接将值复制给将要拷贝的对象。若其中有变量指向外部资源,那么也只是会直接指向同一块外部资源。

      深拷贝:可以理解为,若一个类拥有外部资源,且当这个类的对象发生拷贝的时候,会为新对象分配新的资源。

      >预防浅拷贝问题的方法:

        1)自定义拷贝构造函数和赋值运算符重载函数

        2)将这两个函数私有化,从根本上杜绝浅拷贝的问题

四.memcpy,realloc等函数能否作用于对象的内存拷贝

  memcpy函数用于把资源内存拷贝到目标内存,realloc函数的功能是将mem_address所指内存区域大小重置位newsize。这样的函数是不可以作用于对象的内存拷贝的,因为对象中可能有申请的外部资源,这些函数只进行内存拷贝,不会对对象的外部资源进行拷贝,会出现浅拷贝的问题。在析构时就会因为重复析构同一块外部资源而产生错误。

五.构造函数的初始化列表

如果想在对象成员变量初始化的时候,指定成员变量的初始化方式,那么应该在构造函数的初始化列表中指定。

class A
{
public:
    A(int a,int b,int c)
    :_x(a),_y(b),_z(c)//初始化列表
    {}
private:
    int _x;
    int & _y;//引用必须在定义的时候初始化,并且不能重新赋值,所以必须在初始化列表中初始化
    const int _z;//常量成员只能初始化不能赋值,所以必须在初始化列表中初始化
};

    需要注意:成员的初始化顺序是在类中定义出现的顺序初始化的,而不是按照初始化列表的顺序初始化的。

六.普通成员方法,const成员方法和static静态成员方法的异同

七.普通成员变量,const常/引用成员变量,static成员变量各自的初始化应该怎么写

八.如何计算对象内存的大小,如何查看对象内存的大小

九.关键字explicit、mutable

  explicit关键字的作用是:只有明确的调用构造函数,才会构造对象,否则会报编译错误。它的作用是防止隐式产生临时对象。需要注意的是,explicit只可以修饰构造函数

  mutable的意思是可变的,易变的。在C++中,如果一个成员函数被const修饰,那么它将无法修改其成员变量,但是如果成员变量被mutable修饰,那么就可以突破const的修饰。

十.对象的生存周期,构造、拷贝构造、赋值、析构的详细过程

十一.成员方法如果返回一个对象的值,返回的值的处理过程

十二.对象创建的优化问题

十三.指向类成员的指针,函数指针和变量指针。   

猜你喜欢

转载自www.cnblogs.com/paradoxs/p/9063483.html