新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
C++中,系统不仅会为你提供默认构造函数同时也会为你提供默认拷贝构造函数。那么拷贝构造函数是怎么一回事呢?有这么一段代码:
10年积累的成都网站设计、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有兴平免费网站建设让你可以放心的选择与我们合作。People person ( "chentong", 20, "student" ); People per(person);
假设我们已经有了一个People的类,于是我们申请了一个类变量person。并且,我们对这个类变量进行了初始化。于是,我们申请了第二个类变量per,通过这种写法,我们就相当于把person中的值全部写到了per中去了。因为,默认拷贝构造函数使得两个类变量指向了同一块内存空间。默认拷贝构造函数使得per中的值指向了person中值的地址,换言之,两个类变量指向的是同一块内从空间,当释放内存空间时,可能就会对同一块内存空间进行重复释放,这样就会带来内存泄露的危害。(二次释放,有可能会把有用的值给释放掉,所以,这样做肯定是有危害的)
为了解决二次释放带来的危害,C++允许我们自己写拷贝构造函数。一般情况下,系统会为你提供默认构造函数,但是,如果你自己写构造函数,并且是带参数的构造函数,那么,你必须得提供一个不带参数的构造函数。因为,当你自己写了带参数的构造函数,那么系统将不会为你提供默认构造函数。否则,使用将会出错。
这一次,我们定义两个类,一个People类,一个Student类。
class People { private: char* name; int age; public: People() { } People(char* name, int age) { this->name = name; this->age = age; cout << "name = " << this->name << endl; cout << "age = " << this->age << endl; } //拷贝构造函数 People(People& per) { this->name = per.name; this->age = per.age; } void SetName(char* name) { this->name = name; } void SetAge(int age) { this->age = age; } };
class Student { private: People father;//调用无参构造函数 People mother;//调用有参构造函数 int student_id; public: Student() { } Student(int student_id, char* father, char* mother, int father_age = 42, int mother_age = 41){ this->student_id = student_id; } void PrintInfo() { }
现在我想要使用这些参数来构造我的类变量father和类变量mother。我该怎么做呢?很明显我所构造的类变量father和mother调用的都是无参构造函数,但是,我想要调用有参构造函数,我该怎么做呢?我只要,
Student(int student_id, char* father, char* mother, int father_age = 42, int mother_age = 41 ) : father ( father, father_age ), mother ( mother, mother_age )
在构造函数参数列表的外面,加上一个冒号,然后,把相应类变量的参数传进去。那么假如我先对类变量mother进行初始化,再对类变量father进行初始化,这样会有影响吗?当然不会,初始化的前后顺序并不会影响初始化的结果。因为,我们在创建类变量时,先创建的是类变量father,然后是mother,所以,不管你先对哪个类变量进行初始化,系统都是先对father进行初始化。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。