拷贝构造 - AntonioLMH/C-Tutorial GitHub Wiki
Currency p = bucks;//这是initialization p = bucks;//这是assignment
C++初始化的时候用howMany h(10);和howMany h =10;是等价的。
如果构造函数的参数是自己同类型的const reference,就可以用另外一个同类对象初始化,这叫做拷贝构造; T::T(const T&); 如果没有给,C++会自动给一个。 是成员变量对成员变量的拷贝。
库 size_t strlen(const char* s);和 char *strcpy(char *dest, const char *src);
eg. Person(const Person& w);
Person::Person(const Person& w){ name = new char[::strlen(w.name)+1]; ::strcpy(name,w.name); }
如果调用一个函数时,他说是他的参数是一个对象本身,则是拷贝构造。
1.call by value: eg。void roster(Person); Person child("Ruby"); roster(child);//call function(拷贝构造) 2.初始化: eg. Person baby_a("Fred"); //copy ctor Person baby_b = baby_a;//拷贝构造 Person baby_c(baby_a);//拷贝构造
3.函数返回一个对象
编译器可能会把不必要的copy优化: eg. Person copy_func(char *who){ Person local(who); local.print(); return local;//copy actor called! }
Person nocopy_func(char *who){ return Person(who); }//no copy needed!
任何对象只能被初始化一次,其他都为assignment。
如果name是系统类库里的类型,如string类型的,则不需要写拷贝构造。
string类拷贝,直接相等,不用strcpy。(尽量用string)。
系统的拷贝构造不会malloc,所以调用析构会有问题。
总结: 1.写了一个类: 需要三个函数:1.defalut constructer,2.virtual destructer 3.拷贝构造函数
如果不希望被拷贝,则声明一个private copy ctor。