如果一个构造函数第一个参数是自身类型的引用,且任何额外参数都具有默认值,则此构造函数是拷贝构造函数
class Foo{ public: Foo(); //默认构造函数 Foo(const Foo&); //拷贝构造函数 };
拷贝初始化与直接初始化
string dots(10,'.'); //直接初始化 string s(dots); //直接初始化 string s2=dots; //拷贝初始化 string null_book="123"; //拷贝初始化 string nines=sring(100,'9'); //拷贝初始化
拷贝初始化不仅在我们用=定义变量时会发生,在下列情况也会发生
将一个对象作为实参传递给一个非引用类型的形参
从一个返回类型为非引用类型的函数返回一个对象
用花括号列表初始化一个数组中的元素或一个聚合类中的成员
析构函数
class Foo{ public: Foo(); //默认构造函数 Foo(const Foo&); //拷贝构造函数 ~Foo(); //析构函数 };
在一个析构函数中,首先执行函数体,然后销毁成员,成员按初始化顺序逆序销毁
什么时候会调用析构函数
无论何时一个对象被销毁,就会自动调用析构函数
变量离开其作用域时被销毁
当一个成员别销毁时,其成员被销毁
容器被销毁时,其元素被销毁,
对于动态分配的对象,当只想它的指针应用delete运算符时被 小虎
对于临时对象当创建它的完整表达式结束时被销毁