c++构造函数初始化问题,新手不懂啊

class GradeBook
{
public:
GradeBook(string name)
{
setCourseName(name);//调用函数赋值,构造函数的好处是:只是简单调用,要改变时只需对被调用函数进行修改,这句话怎么理解?为什么这样就初始化了?
}

void setCourseName(string name)
{courseName=name; }
string getCourseName()
{
return courseName;
}

void displayMessage()
{
cout<<"Welcome to the grade book for\n"<<getCourseName() <<"!"<<endl;
}
private: string courseName;
};

    当你新建一个对象时,GradeBook a;或者GradeBook a("abc");编译器就会自动调用构造函数进行初始化。前者是系统默认的,当你未定义构造函数时,系统就调用默认的构造函数:GradeBook() ;后者则是调用你自己建立的构造函数。你可以利用重载建立N个不同的构造函数。

    构造函数是新建对象时必然触发的,不能自己控制何时使用,或者不用构造函数。

    构造函数比赋值函数好,因为任何对象建立时不给于初始化,就是一种安全隐患,比你先建立再赋值要好多了。

    构造函数目的在于初始化,所以写构造函数时尽量简单,不要把多余的功能写进里面,不然会造成过于复杂,影响程序可读性。

————————————

你的构造函数里,简单调用了一个set方法来进行初始化,这样有几个好处:

1、使用类内置的方法更安全,不会影响到整个构造函数。比如我类有2个成员:string name,int no;

GradeBook(string name,int no)
{
setName(name);
setNo(no);
}

如果我不仅要设置name还要有其他的功能(跟name有关)就可以直接修改,setName方法不必影响到no的初始化,整个构造函数也没有其他影响

2、通过调用set方法来赋值,使得程序结构更清晰,一看就知道这段程序什么意思。


不过缺点就是太繁琐,一般直接赋值,或者C++的方法

GradeBook(string name,int no):name(name),no(no){}

用这种set方法整理程序结构是重构的常用方法,不过一般构造函数中不常用。


和楼上意见比较一致就是在传递参数的时候多用引用,java中虽然没有显示的引用传递,但对类对象都是以引用传递的,所以一般喜欢这样写。C++中要显示使用引用,可以节省大类型的拷贝。

GradeBook(const string& name,const int& no):name(name),no(no){} 

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-20
GradeBook(string name)
{
setCourseName(name);//调用函数赋值,构造函数的好处是:只是简单调用,要改变时只需对被调用函数进行修改,这句话怎么理解?为什么这样就初始化了?
}
这句话的意思就是啊 你看这里调用了一个setCourseName函数 但这个函数的具体过程是在别的地方定义的 而GradeBook这个构造函数不需要了解这些细节 他只知道在构造的时候需要进行setCourseName的操作 使得流程更加清晰
至于为什么要初始化 怎么就初始化 创建对象的时候会分配内存 这部分内存未初始化之前可能是完全随机的内容 需要对其进行基本的赋值 在C中的struct就是这样 而C++中有了类 许多工作就由构造函数来做了 比如string就是个类 她自己也有构造函数 在构造GradeBook的构造函数中 编译器会在代码前端 也就是调用setCourseName之前 插入初始化courseName的代码 也就是对它调用string的构造函数 这个过程是可控的 将代码改为

GradeBook(string name) : courseName(name) { } 可以避免对其的多次赋值
这段代码在没有优化的情况下性能是非常糟糕的 绝对不可以在生产环境内使用 但在构造一个简单的只包含一个string的类的情况下 至少把输入字符串复制了三次. 可以考虑中const string& 引用的方式去传(递)参(数)
强烈建议阅读入门书籍如C++ Primer 最近出新版了 有C++11的内容
第2个回答  2013-07-20
首先,没一个类都必须有构造函数,就是告诉计算机怎么生成这个类的对象。
如果你不定义构造函数,编译器会给你个默认的。
例如定义类 MyClass,其默认的构造函数为MyClass();
构造函数也是可以重载的,即你可以定义好多的构造函数,如MyClass(int),MyClass(string),MyClass(MyClass *) ……
这样做的意思就是,你可以告诉计算机,我定义的这个类有好多好多的构造方式。而且,当你后期回头再维护代码,或是你在写到系统的其他地方时,发现之前定义的构造函数可能不太方便,那么你可以再重新的定义一个新的,这样不会影响现有代码。
第3个回答  2013-07-20
对于类的话,里面会有成员函数和数据成员,在构造类的对象时例如: GradeBook g(s),s是string类型的变量,就需要对类中的成员函数赋值,通过构造函数来赋值,构造函数的参数就是要赋值的成员变量的值,在你的例子中你在构造函数中用了一个函数来赋值是可以的,当然不用这个函数,直接在构造函数中写:coursename=nsme;也是可以的,总之类中数据成员的赋值是构造函数来完成的,构造函数说白了它的函数体就是给类的成员变量赋值,它的参数就是要赋值给数据成员的值。
第4个回答  2013-07-20
简单点说:先建一个类,里面有各种参数和一些函数,其中有构造函数。当你想创建这个类下的一个对象的时候,就调用构造函数给这个对象的一些参数赋值,等等(即初始化)。也就是说先建好了构造函数,但是在用的的时候(创建该类对象)才调用(程序自动完成)。
相似回答