基本用法
//类声明文件stock.h #ifndef UNTITLED_STOCK00_H #define UNTITLED_STOCK00_H #include <string> class Stock { private: std::string company_; public: Stock(); //默认构造函数 Stock(const std::string &company); void show(); }; #endif //UNTITLED_STOCK00_H
//类方法定义文件stock.cpp #include <iostream> #include <string> #include "stock00.h" void Stock::show() { std::cout<<company_<<std::endl; } Stock::Stock() { company_ = "xmm"; std::cout<<"use default constructor"<<std::endl; } Stock::Stock(const std::string &company) { company_ = company; std::cout<<"use constructor"<<std::endl; }
//使用文件main.cpp #include <iostream> #include "stock00.h" using namespace std; int main() { Stock S; //调用默认构造函数 //注意:Stock S();声明了一个返回Stock的函数而不是调用默认构造函数 S.show(); Stock S1("xumaomao"); //隐式的调用构造函数 //Stock S1 = Stock("xumaomao"); //显式的调用构造函数 S1.show(); return 0; }
必须使用列表初始化的情况
class ConstRef { public: ConstRef(int ii); private: int i; const int ci; int &ri; }; ConstRef::ConstRef(int ii): i(ii), ci(ii), ri(i) {}
注意:成员初始化的顺序与它们在类定义中出现的顺序一致。
复制构造函数
新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。
以下4中情况都将调用复制构造函数:
StringBad ditto(motto); StringBad metoo = motoo; StringBad also = StringBad(motto); StringBad * pStringBad = new StringBad(motto);
注意:如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据(因为默认复制构造函数自会复制这个指针而不会复制指针指向的数据,这样在用析构函数释放内存时回导致同段内存被多次释放的问题),这被称为深度复制。