C++类的构造函数和复制构造函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++类的构造函数和复制构造函数

[日期:2011-03-11] 来源:LinuxLinux 作者:pcliuguangtao

首先,我们先看一个小小的问题:

#include

#include

using namespace std;

class C{

public:

C(){

cout<<"cccc"<

}

C( C& c){

m = c.m;

cout<<"copy constructor"<

}

string m;

};

int main() {

string x ="ssss";

C c2=C();

//报错:no matching function for call to 'C::C(C)'

return 0;

}

作者的问题有:

1、C c2=C() 为什么出错误?为什么构造函数要改成C(const C& c)?

2 、为什么调用无参构造函数时不能写成:C c(); ?

开始介绍关于类构造函数的知识点:

1、首先,类的构造函数是用来处理对像的初始化的,并且,构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来(显式)的调用它,而是

在建立对象时自动执行。

那么怎样才叫显式的调用那?

比如已经有一个Student类

class Student

{

public:

Student(int num,int score ):

m_number( num ),m_score(score ){}

Studnet( ){} //默认构造函数

void PrintInfo( )

{

cout<

}

private:

int m_number;

int m_score;

};

Student stud_one.Student(123,96); //显式调用构造函数,编译器不允许

Student Stud_two(124,98); //正确的调用方式

Student stud_three;

stud_three.Student(125,99) ; //也是错误的,构造函数是在建立对象时有系统自动执行的,而且只执行一次。

2、默认构造函数:

建立一个对象时不需要给出实参的构造函数,叫该类的默认构造函数,又名缺省构造函数。

比如:

Student(){} // (如果我们没有自己定义一个默认构造函数,编译器默认添加该构造函数作为默认构造函数)、Student(int num=123,int score=60):m_number(num),m_score(score){} //一个构造函数给出了所有数据成员的默认值

一个类只能有一个默认构造函数(也可以说成,可以不使用参数而调用的构造函数,一个类只能有一个),否则,系统就无法辨别出默认的时候应该调用那个来构造一个新的对象!

3、复制和赋值

复制:一个新的对象用一个已存在的对象来初始化,如Student temp(stud_one); 或者Student temp=stud_one;

但要注意,使用复制的前提是你已经定义了该类的复制构造函数Student::Student(const Student& b )

(其中的const只是说明,在复制构造函数中不允许修改b对象的值!)

赋值:两个已存在的对象赋值,编译器已经给我们重载了“=”,所以我们不用自己再定义,比如stud_one=stud_two;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~

下面来分析开始给出的两个问题:

1、C c2=C();

这个语句没有调用复制构造函数,而只是调用了C类的构造函数,所以会输出“cccc”,而不是“copy constructor”;

我们需要加上const,是

因为G++是遵循了C++标准(2003)中的规定:非const引用不能绑定于临时对象。加上一个const才能编译通过。

2、C c()编译器理解为定义一个函数c(),他的返回值为一个C 类的像。

相关文档
最新文档