C++函数学习

内联函数
编译器编译的时候直接将函数的内容作为调用函数的一部分,避免了调用函数所产生的开销。

inline function(int x, int y) {
    cout<<x - y;
} 

函数的缺省值

//设置函数的缺省值 
void function(int x, int y = 2, int z = 3) {
    cout<<x+y+z;
}

构造函数

对象所占用的存储空间并不是由构造函数分配的,构造只是在对象的存储空间分配之后,来完成一写初始化的工作。

复制构造函数

只能有一个参数,即同类对象的引用。如果自己不写复制构造函数,系统将提供一个默认的复制构造函数,这儿构造函数的功能完成对对象的拷贝。
复制构造函数起作用的三种情况:

  • 用一个对象去初始化另一个对象。例如 Complex c2 = c1 //初始化语句
  • 如果某一个函数的形参是类A的对象,调用该函数的时候,类A的复制构造函数将被调用 用来 初始化形参。
  • 如果一个函数的返回值是类A的对象,那么函数返回的时候类A的复制构造函数将被调用。复制构造函数用来初始化作为返回值存在的类A对象,例如函数method()的返回值赋值给a, 那么类的A的复制构造函数用来初始化a.

析构函数
析构函数与构造函数相反是在一个对象被释放掉的时候调用,与Java中Object的finalize 方法相似。析构函数有以下几个调用的时机

  • 使用 delete 删除 new所分配的对象。
  • 当一个作用域结束的时候,其中对象的析构方法将被调用。
  • 临时对象的生存期结束。
  • 程序结束,并且存在全局或静态对象,对象的析构函数将被调用。
  • 显示的调用一个对象的析构方法时。

    使用析构函数时,如果一个类中都是对象和基本类型,那么在析构函数调用的时候将自动的调用这些对象和基本类型的析构函数,如果其中包含了自己手动申请的空间,那么需要自己手动的在析构函数中去释放这些空间。

    public:

    Book* book;
    
    MyClass(Book* book) {
        this->book = book;
    }
    ~MyClass() {
        book->~Book();
        cout<<"MyClass析构函数被调用"<<endl; 
    }
    

    };

    如果在MyClass的析构函数中没有手动去的去调用~Book(),那么book所指向的内存将不会释放。