如何使用构造函数?

Posted

技术标签:

【中文标题】如何使用构造函数?【英文标题】:how do I use a constructor? 【发布时间】:2020-01-13 09:54:44 【问题描述】:

我刚刚了解了 C++ 中的类并编写了一个运行良好的代码,但后来我被要求使用构造函数,但我还没有了解它。我今天应该上传这个,如果在课堂上教授这个要求,我会很容易做到这一点,但遗憾的是没有。

在参考了讲义示例后,我尝试根据我所知道的修改代码,但我仍然不确定这个构造函数是如何工作的,或者我应该如何实现它。现在我只尝试将它用于讲师,我将值传递给名为SetLecturerName 的构造函数,但我不确定我还应该做什么。如果有人可以查看此代码并让我知道我哪里出错了,我将不胜感激。

要求是为讲师和课程名称使用构造函数。我想先解决一个,然后单独管理另一个。


    #include <iostream>
    #include <string>   //program uses c++ standard string class


    using namespace std;


    class GradeBook        //gradebook class definition
    //PUBLIC-------------------------------------------------------------------------------------------------------     
        public:


        //COURSE---------------------------------------------------------------------------------------------------
        void setCourseName(string name)        //function that sets the course name
            courseName = name;      //store the course name in the object
        

        string getCourseName()     //function that gets the course name
            return courseName;      //return the object's courseName
        


        //LECTURER------------------------------------------------------------------------------------------------- 
        /*void setLecturerName(string LecName)     //function that sets the course name
            lecturerName = LecName;     //store the course name in the object
        */


        GradeBook(string Lname)
            SetLecturerName(Lname);     //calling the constructor function
        


        void SetLecturerName(string LecName)       //The constructor function
            lecturerName = LecName;     //store the course name in the object
        


        string getLecturerName()       //function that gets the course name
            return lecturerName;        //return the object's courseName
           


        //WELCOME MESSAGE------------------------------------------------------------------------------------------ 
        void displayMessage()      //function that displays a welcome message
            cout << "==================================" << endl;
            cout << "Welcome to the grade book for\n" << getCourseName() << "!" << endl << endl;        //this statement calls getCourseName to get the name of the course this gradebook represents
            cout << "This course is presented by, \n" << getLecturerName() << "." << endl;
            cout << "==================================" << endl;
        


    //PRIVATE------------------------------------------------------------------------------------------------------
        private:
        string courseName;      //course name for this gradebook
        string lecturerName;        //Lecturer name for this gradebook
    ;


    int main()
        string nameOfCourse;        //string of characters to store the course name
        string nameoflecturer;      //string of characters to store the lecturer name
        GradeBook myGradeBook(nameoflecturer);      //create a GradeBook object named myGradeBook


        //COURSE---------------------------------------------------------------------------------------------------
        cout << "\nPlease enter the course name:" << endl;
        getline(cin, nameOfCourse);     //read a course name with blanks
        myGradeBook.setCourseName(nameOfCourse);        //set the course name


        //LECTURER-------------------------------------------------------------------------------------------------
        cout << "\nPlease enter the Lecturer's name including the title(Ex- Mr.):" << endl;
        getline(cin, nameoflecturer);
        myGradeBook.setLecturerName(nameoflecturer);


        //WELCOME MESSAGE------------------------------------------------------------------------------------------
        cout << endl;
        myGradeBook.displayMessage();       //display message with new course name
    

【问题讨论】:

“构造函数”一词不存在。您确实有一个构造函数,并且您在 GradeBook myGradeBook(nameoflecturer); 行中使用它,因此不清楚您在问什么 您是否在任何 C++ 学习资料中查找过构造函数?你的问题到底是什么? GradeBook(string Lname) 是一个构造函数,GradeBook myGradeBook(nameoflecturer) 给它一个空字符串。您可能想要删除 setCourseNameSetLecturerName,或者至少让它们成为private: "...让我知道我哪里出错了。"为什么你认为代码有问题?你得到编译器错误吗?运行时错误?出乎意料的结果?你的导师对你当前的代码有什么不满? 创建类的实例总是调用构造函数。在类中,构造函数是一个不接受参数且没有返回类型的函数。参数列表提供值。例如,如果名为 Class 的类有一个构造函数,该构造函数按值接受 int,则变量定义 Class x(2) 将调用该构造函数(如果可访问)并将值 2 传递给它。跨度> 我做得很好,上一个问题是要求遵循一个模板,该模板已经展示了如何使用类(不使用构造函数)显示课程名称,并要求添加讲师姓名以同样的方式。但是这个问题要求使用构造函数。给出的模板是完全不同的东西,而且由于没有正确地教给我们,我使用了上一个问题,只是按照我理解的方式添加了一个构造函数。我遵循模板显示的确切方式,但似乎没有显示任何结果 【参考方案1】:

就像您现在的代码一样,您首先创建一个带有空讲师的GradeBook 实例,然后在读取讲师时更改讲师。虽然这可行,但首先读取名称然后创建对象会更有意义。

所以你会创建一个类似的构造函数

class GradeBook 
// ...
  GradeBook(string lecturer, string course) 
    lecturerName = lecturer;
    courseName = course;
  
// ...

或者,使用初始化列表:

  GradeBook(string lecturer, string course) :
    lecturerName(lecturer),
    courseName(course)
   

main():

int main() 
    string nameOfCourse;
    string nameoflecturer;

    cout << "\nPlease enter the course name:" << endl;
    getline(cin, nameOfCourse);
    cout << "\nPlease enter the Lecturer's name including the title(Ex- Mr.):" << endl;
    getline(cin, nameoflecturer);

    GradeBook myGradeBook(nameoflecturer, nameOfCourse);
    // ...

【讨论】:

最好使用构造函数初始化列表来初始化成员,而不是在构造函数体中赋值 @foreknownas_463035818 是的,但我认为这会让以前从未听说过构造函数的人感到困惑。我会添加它。 ymmv,我认为使用它时不显示它会令人困惑,因为它几乎没有成本具有明显的优势;) 是的,这也有效,但显然这个问题非常棘手,它要求一个 get 和 set 函数,就像我在我的代码中所做的那样。这太令人沮丧了。

以上是关于如何使用构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制调用某些构造函数/函数以使用命名参数?

如何在 Mac OS 上使用 Eclipse 生成 C++ 构造函数/复制构造函数

如何在构造函数 C++ 中使用静态变量?

如何使用 swig 修改类构造函数以保持对构造函数参数之一的引用?

如何将构造函数与数组一起使用?

如何在 Java 中从另一个构造函数调用一个构造函数?