欢迎来到天天文库
浏览记录
ID:12145890
大小:28.00 KB
页数:3页
时间:2018-07-15
《c++类的构造函数和复制构造函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C++类的构造函数和复制构造函数[日期:2011-03-11]来源:LinuxLinux 作者:pcliuguangtao首先,我们先看一个小小的问题:#include#includeusingnamespacestd;classC{public: C(){ cout<<"cccc"<2、){ stringx="ssss"; Cc2=C(); //报错:nomatchingfunctionforcallto'C::C(C)' return0; }作者的问题有:1、Cc2=C() 为什么出错误?为什么构造函数要改成C(constC&c)?2、为什么调用无参构造函数时不能写成:C c(); ?开始介绍关于类构造函数的知识点:1、 首先,类的构造函数是用来处理对像的初始化的,并且,构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来(显式)的调用它,而是在建立对象时自动执行。3、那么怎样才叫显式的调用那?比如已经有一个Student类classStudent{public: Student(intnum,intscore ): m_number(num),m_score(score){} Studnet( ){} //默认构造函数 voidPrintInfo( ) { cout<4、tudentstud_one.Student(123,96); //显式调用构造函数,编译器不允许StudentStud_two(124,98); //正确的调用方式Studentstud_three;stud_three.Student(125,99); //也是错误的,构造函数是在建立对象时有系统自动执行的,而且只执行一次。2、默认构造函数: 建立一个对象时不需要给出实参的构造函数,叫该类的默认构造函数,又名缺省构造函数。比如:Student(){} /5、/(如果我们没有自己定义一个默认构造函数,编译器默认添加该构造函数作为默认构造函数)、Student(intnum=123,intscore=60):m_number(num),m_score(score){} //一个构造函数给出了所有数据成员的默认值一个类只能有一个默认构造函数(也可以说成,可以不使用参数而调用的构造函数,一个类只能有一个),否则,系统就无法辨别出默认的时候应该调用那个来构造一个新的对象!3、复制和赋值复制:一个新的对象用一个已存在的对象来初始化,如 Studenttemp(stu6、d_one); 或者Studenttemp=stud_one;但要注意,使用复制的前提是你已经定义了该类的复制构造函数Student::Student(constStudent&b)(其中的const只是说明,在复制构造函数中不允许修改b对象的值!)赋值:两个已存在的对象赋值,编译器已经给我们重载了“=”,所以我们不用自己再定义,比如stud_one=stud_two;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7、~~~~~~~~~~~~~~~~~~~~下面来分析开始给出的两个问题:1、Cc2=C();这个语句没有调用复制构造函数,而只是调用了C类的构造函数,所以会输出“cccc”,而不是“copyconstructor”;我们需要加上const,是因为G++是遵循了C++标准(2003)中的规定:非const引用不能绑定于临时对象。加上一个const才能编译通过。2、Cc()编译器理解为定义一个函数c(),他的返回值为一个C类的像。
2、){ stringx="ssss"; Cc2=C(); //报错:nomatchingfunctionforcallto'C::C(C)' return0; }作者的问题有:1、Cc2=C() 为什么出错误?为什么构造函数要改成C(constC&c)?2、为什么调用无参构造函数时不能写成:C c(); ?开始介绍关于类构造函数的知识点:1、 首先,类的构造函数是用来处理对像的初始化的,并且,构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来(显式)的调用它,而是在建立对象时自动执行。
3、那么怎样才叫显式的调用那?比如已经有一个Student类classStudent{public: Student(intnum,intscore ): m_number(num),m_score(score){} Studnet( ){} //默认构造函数 voidPrintInfo( ) { cout<4、tudentstud_one.Student(123,96); //显式调用构造函数,编译器不允许StudentStud_two(124,98); //正确的调用方式Studentstud_three;stud_three.Student(125,99); //也是错误的,构造函数是在建立对象时有系统自动执行的,而且只执行一次。2、默认构造函数: 建立一个对象时不需要给出实参的构造函数,叫该类的默认构造函数,又名缺省构造函数。比如:Student(){} /5、/(如果我们没有自己定义一个默认构造函数,编译器默认添加该构造函数作为默认构造函数)、Student(intnum=123,intscore=60):m_number(num),m_score(score){} //一个构造函数给出了所有数据成员的默认值一个类只能有一个默认构造函数(也可以说成,可以不使用参数而调用的构造函数,一个类只能有一个),否则,系统就无法辨别出默认的时候应该调用那个来构造一个新的对象!3、复制和赋值复制:一个新的对象用一个已存在的对象来初始化,如 Studenttemp(stu6、d_one); 或者Studenttemp=stud_one;但要注意,使用复制的前提是你已经定义了该类的复制构造函数Student::Student(constStudent&b)(其中的const只是说明,在复制构造函数中不允许修改b对象的值!)赋值:两个已存在的对象赋值,编译器已经给我们重载了“=”,所以我们不用自己再定义,比如stud_one=stud_two;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7、~~~~~~~~~~~~~~~~~~~~下面来分析开始给出的两个问题:1、Cc2=C();这个语句没有调用复制构造函数,而只是调用了C类的构造函数,所以会输出“cccc”,而不是“copyconstructor”;我们需要加上const,是因为G++是遵循了C++标准(2003)中的规定:非const引用不能绑定于临时对象。加上一个const才能编译通过。2、Cc()编译器理解为定义一个函数c(),他的返回值为一个C类的像。
4、tudentstud_one.Student(123,96); //显式调用构造函数,编译器不允许StudentStud_two(124,98); //正确的调用方式Studentstud_three;stud_three.Student(125,99); //也是错误的,构造函数是在建立对象时有系统自动执行的,而且只执行一次。2、默认构造函数: 建立一个对象时不需要给出实参的构造函数,叫该类的默认构造函数,又名缺省构造函数。比如:Student(){} /
5、/(如果我们没有自己定义一个默认构造函数,编译器默认添加该构造函数作为默认构造函数)、Student(intnum=123,intscore=60):m_number(num),m_score(score){} //一个构造函数给出了所有数据成员的默认值一个类只能有一个默认构造函数(也可以说成,可以不使用参数而调用的构造函数,一个类只能有一个),否则,系统就无法辨别出默认的时候应该调用那个来构造一个新的对象!3、复制和赋值复制:一个新的对象用一个已存在的对象来初始化,如 Studenttemp(stu
6、d_one); 或者Studenttemp=stud_one;但要注意,使用复制的前提是你已经定义了该类的复制构造函数Student::Student(constStudent&b)(其中的const只是说明,在复制构造函数中不允许修改b对象的值!)赋值:两个已存在的对象赋值,编译器已经给我们重载了“=”,所以我们不用自己再定义,比如stud_one=stud_two;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7、~~~~~~~~~~~~~~~~~~~~下面来分析开始给出的两个问题:1、Cc2=C();这个语句没有调用复制构造函数,而只是调用了C类的构造函数,所以会输出“cccc”,而不是“copyconstructor”;我们需要加上const,是因为G++是遵循了C++标准(2003)中的规定:非const引用不能绑定于临时对象。加上一个const才能编译通过。2、Cc()编译器理解为定义一个函数c(),他的返回值为一个C类的像。
此文档下载收益归作者所有