c++构造函数初始化问题,新手不懂啊
{
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){}
{
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的内容
如果你不定义构造函数,编译器会给你个默认的。
例如定义类 MyClass,其默认的构造函数为MyClass();
构造函数也是可以重载的,即你可以定义好多的构造函数,如MyClass(int),MyClass(string),MyClass(MyClass *) ……
这样做的意思就是,你可以告诉计算机,我定义的这个类有好多好多的构造方式。而且,当你后期回头再维护代码,或是你在写到系统的其他地方时,发现之前定义的构造函数可能不太方便,那么你可以再重新的定义一个新的,这样不会影响现有代码。
广告 您可能关注的内容 |