天之道

享受编程的乐趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C++中如何使用构造函数初始化对象

Posted on 2011-09-22 00:01 hoshelly 阅读(2193) 评论(0)  编辑 收藏 引用 所属分类: C++
构造函数是什么?看下面几行代码:
class GradeBook
{
  public:
      void setCourseName(string name)
      {
              courseName=name;
       }
       string getCourseName()
       {
            return courseName;
       }
       GradeBook myGradeBook;
       cout<<"Initial course name is: "<<myGradeBook.getCourseName()<<endl;
}
这几行代码中,定义一个类GradeBook,成员访问说明符public表示在这个符号之下的函数,函数都是公共可相互被调用的。创建GradeBook类的对象时(对象可以这样创建:GradeBook myGradeBook; 这里myGradeBook就是类的对象 ),该对象的数据成员courseName被初始化为默认的空串。事实上,我们可用定义一个构造函数,用于类对象创建时的初始化。
构造函数是一种特殊的成员函数,定义时必须与类同名。它和其他成员函数的一个重大差别是构造函数不能返回值,通常构造函数声明为public。

请看一个实例:
 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 class GradeBook  //定义类
 6 {
 7 public:
 8     GradeBook(string name)//定义了GradeBook类的一个构造函数,有一个string形参name,与下面的形参name名字相同,但互不干扰
 9     {
10         setCourseName(name);//调用函数赋值,构造函数的好处是:只是简单调用,要改变时只需对被调用函数进行修改
11     }
12 
13     void setCourseName(string name)//这个函数的形参为name
14     {
15         courseName=name;
16     }
17     string getCourseName()
18     {
19         return courseName;
20     }
21 
22     void displayMessage()
23     {
24         cout<<"Welcome to the grade book for\n"<<getCourseName() //下面的main()函数中,没有调用getCourseName()函数
25             <<"!"<<endl;
26     }
27 private:    // 私有的,在这个成员访问说明符之后声明的变量或者函数,只可以被声明它们的类的成员函数所访问
28     string courseName;
29 };
30 
31 int main()
32 {
33     GradeBook gradeBook1("CS101 Introduction to C++ Programming"); //创建类的对象,并把实参赋予形参name
34     GradeBook gradeBook2("CS102 Data Structures in C++");
35 
36     cout<<"gradeBook1 created for course: "<<gradeBook1.getCourseName()   //调用类的成员函数getCourseName(),初始化类的对象
37         <<"\ngradeBook2 created for course: "<<gradeBook2.getCourseName()<<endl;
38 }
39 
40 


PS:1)为类提供默认构造函数的两种方法:编译器隐式地在没有定义构造函数的类中创建一个默认的构造函数,这样的默认构造函数不初始化类的数据成员,而是调用其他类的对象的每个数据成员的默认构造函数。没有初始化的变量通常包含“垃圾”值。
  程序员显式定义一个不接受实参的构造函数。

2)除非没有必要初始化类的数据成员(几乎不可能),否则请提供构造函数,这样可以保证当类的每一个新对象被创建时,类的数据成员都用有意义的值进行了初始化。






          

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理