类的构造函数:
-
对象的初始化:
-
变量的初始化
int a = 0;
,那么类对象是如何初始化的呢?本身类是自从结构体发展过来的,所以结构体的初始化操作,类都支持,可以这样在定义的时候直接初始化,也可以先定义后初始化int main() { Student stu1 = {"zhang_san", 1101, 21}; Student stu2; strcpy(stu2.name, "li_shi"); stu2.num = 1102; stu2.age = 18; Student stu_ary[1000]; return 0; }
按照如上方法进行初始化当然是没有任何问题的,但是遇到如
stu_ary[1000]
该如何初始化呢?循环吗,这是费力不讨好的办法(人费劲,CPU也费劲),这时候我们的构造函数就出场了。
-
-
构造函数:
-
定义:用于初始化对象的自动被调用的特殊成员函数。
构造函数就是解决上面的问题而存在的,构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来主动调用它,构造函数会在对象被建立时自动被调用的。作用就是用来处理对象的初始化操作。
-
注意事项:
①. 构造函数的名字必须与类名同名,不能随意命名,这样的话才能让编译器认为该函数是构造函数,而不是类的普通成员函数;
②. 构造函数不具有任何类型,不返回任何值,连 void 都不是;
③. 构造函数不需要用户调用,也不应该被用户调用,它是对象建立的时候自动被系统调用,用来初始化刚刚建立的对象的;
④. 如果用户没有定义自己的类的构造函数,那么系统会自动生成一个默认的构造函数,只不过该构造函数的函数体是空的,也就是什么都不做。 -
为Student类实现构造函数:
class Student { public: char name[50]; int num; int age; public: void print_imt(); Student(); //构造函数的声明 }; void Student::print_imt() { std::cout << "The information of student:\n\tName: " << name <<"\n\tNo.: "<<num<<"\n\tAge: "<<age<<std::endl; } Student::Student() //构造函数的实现 { memset(name, 0, 50); num = 0; age = 0; } int main() { Student stud; stud.print_imt(); return 0; }
-
-
带参构造函数:
既然构造函数也是函数,那么这个构造函数是否可以带参数呢?答案是肯定的。
Student 类不仅提供了默认的不带参数的构造函数,可以允许用户在定义类对象的时候自动调用,那么是否也可以提供一个带参数的构造函数,可以允许用户在定义类对象的时候就利用构造函数的参数来初始化对象的成员呢?代码演示如下:
class Student { public: char name[50]; int num; int age; public: void print_imt(); Student(); //构造函数的声明 Student(int num); //有参构造函数的声明 }; void Student::print_imt() { std::cout << "The information of student:\n\tName: " << name <<"\n\tNo.: "<<num<<"\n\tAge: "<<age<<std::endl; } Student::Student() //构造函数的实现 { memset(name, 0, 50); num = 0; age = 0; } Student::Student(int num) //有参构造函数的实现 { memset(name, 0, 50); this->num = num; age = 0; } int main() { Student stud1; stud1.print_imt(); Student stud2(1101); stud2.print_imt(); return 0; }