class Student { private: int num; int score; string name; }
1 简单地说,构造函数是一种函数,是当一个对象被建立时,程序为对象进行初始化而调用的函数;
2 类的数据成员在声明时是不能初始化的, 因为类不是一个实体而是一种抽象类型,并不占存储空间,无处容纳数据,如下例是不合法的;
class Student { private: int num=123; int score=100; string name="World"; }
3 构造函数只有一个作用, 对对象进行初始化 ( 也可以进行别的操作, 不过不常用, 也不提倡用 );
4 构造函数不具备任何类型,因此也没有返回值, 必须与类同名, 不能自定义, 一般声明为 public;
// 类内定义 class Student { public: Student( ){ int num=123; int score=100; string name="World"; } private: int num; int score; string name; } // 类外定义 class Student { public: Student( ); private: int num; int score; string name; } Student::Student( ) { int num=123; int score=100; string name="World"; }
5 在类对象进入其作用域时调用构造函数;
6 构造函数不需要调用也不能被调用;
7 如果缺省, 系统会自动添加一个构造函数, 没有参数, 函数体为空,不做任何操作, 如初始化等;
8 不带参数的构造函数为默认构造函数, 对不同对象都初始化成相同初始值;
9 带参数的构造函数, 可以实现对象不同初始值也不同;
class Student { public: Student( string &st){// 一个个参数的 int num=123; int score=100; string name=st; } Student( int n, int s ){// 两个参数的 int num=n; int score=s; string name="World"; } Student( int n, int s, string &st ){// 三个参数的 int num=n; int score=s; string name=st; } private: int num; int score; string name; }
10 参数初始化表对数据成员初始化, 初始化不是在函数体内实现的,而是在函数首部实现;
class Student { public: Student( int n, int s, string &st ): num(n), score(s), name( st){} private: int num; int score; string name; }
11 构造函数的重载: 具有相同的函数名, 而参数的个数或者参数的类型不同;
12 一个类中可以有多个构造函数, 但建立对象时, 只执行其中一个;
13 带默认参数的构造函数 :
1 提供建立对象的多种选择, 相当于多个重载函数;
2 在构造函数声明是指定默认值,而不是在定义时;
3 声明构造函数时形参名可以省略;
4 如果全部参数都指定了默认值,则在定义对象时可以有一个或多个实参,甚至没有实参;
5 全部参数都指定了默认值也是默认构造函数;
6 定义了全部参数都指定了默认值的构造函数,不能再重载构造函数;